【问题标题】:How to append output to the end of a text file如何将输出附加到文本文件的末尾
【发布时间】:2011-09-06 15:30:30
【问题描述】:

如何将命令的输出附加到文本文件的末尾?

【问题讨论】:

    标签: bash shell


    【解决方案1】:

    将输出定向到文件时使用>> 而不是>

    your_command >> file_to_append_to
    

    如果file_to_append_to 不存在,则会创建它。

    示例:

    $ echo "hello" > file
    $ echo "world" >> file
    $ cat file 
    hello
    world
    

    【讨论】:

    • 问题是echo 从字符串中删除了换行符。如何将包含换行符的字符串附加到文件中?
    • @TimothySwan,我相信使用 -e 选项。
    • echo 不会从字符串中删除换行符。如果你没有正确引用参数,那么 shell 将拆分字符串并将参数传递给 echo 并且 echo 甚至不会看到换行符。
    • echo 不能扩展转义序列。请改用printf
    • @Pmpr 注意 echo 不是 solution 的一部分,它只是我输入的 example 的一部分,并且没有示例中的转义序列。
    【解决方案2】:

    append一个文件使用>>

    echo "hello world"  >> read.txt   
    cat read.txt     
    echo "hello siva" >> read.txt   
    cat read.txt
    

    那么输出应该是

    hello world   # from 1st echo command
    hello world   # from 2nd echo command
    hello siva
    

    overwrite一个文件使用>

    echo "hello tom" > read.txt
    cat read.txt  
    

    那么输出是

    hello tom

    【讨论】:

      【解决方案3】:

      您可以使用 >> 运算符。这会将命令中的数据附加到文本文件的末尾。

      要测试这个尝试运行:

      echo "Hi this is a test" >> textfile.txt
      

      这样做几次然后运行:

      cat textfile.txt
      

      您会看到您的文本已多次附加到 textfile.txt 文件中。

      【讨论】:

        【解决方案4】:

        使用command >> file_to_append_to 附加到文件。

        例如echo "Hello" >> testFile.txt

        注意:如果您只使用一个 >,您将覆盖文件的内容。为确保不会发生这种情况,您可以将set -o noclobber 添加到您的.bashrc

        这样可以确保如果您不小心在现有文件中键入了command > file_to_append_to,它会提醒您该文件已经存在。示例错误消息:file exists: testFile.txt

        因此,当您使用> 时,它只允许您创建一个新文件,而不是覆盖现有文件。

        【讨论】:

          【解决方案5】:

          使用带有选项 -a (--append)tee 允许您一次附加到多个文件,也可以使用 sudo(在附加到受保护的文件时非常有用)。除此之外,如果您需要使用 bash 之外的其他 shell,这很有趣,因为并非所有 shell 都支持 > 和 >> 运算符

          echo "hello world" | sudo tee -a output.txt
          

          thread 这个thread 对 tee 有很好的回答

          【讨论】:

          • 这是用新行追加内容的最佳方式。
          • 正在寻找一种附加到受保护文件的方法,这解决了它
          【解决方案6】:

          使用>> 运算符将文本附加到文件中。

          【讨论】:

            【解决方案7】:

            对于整个问题:

            cmd >> o.txt && [[ $(wc -l <o.txt) -eq 720 ]] && mv o.txt $(date +%F).o.txt
            

            这会将 720 行 (30*24) 追加到 o.txt 中,之后将根据当前日期重命名文件。

            使用 cron 每小时运行一次上述操作,或者

            while :
            do
                cmd >> o.txt && [[ $(wc -l <o.txt) -eq 720 ]] && mv o.txt $(date +%F).o.txt
                sleep 3600
            done
            

            【讨论】:

              【解决方案8】:

              我会使用 printf 而不是 echo,因为它是 more reliable 并且可以正确处理新行 \n 等格式。

              此示例产生类似于前面示例中的 echo 的输出:

              printf "hello world"  >> read.txt   
              cat read.txt
              hello world
              

              但是,如果您在本例中将 printf 替换为 echo,echo 会将 \n 视为字符串,从而忽略意图

              printf "hello\nworld"  >> read.txt   
              cat read.txt
              hello
              world
              

              【讨论】:

                【解决方案9】:

                我经常混淆这两者。通过他们的输出更好地记住:

                > 用于覆盖

                $ touch someFile.txt
                $ echo ">" > someFile.txt
                $ cat someFile.txt
                  >
                $ echo ">" > someFile.txt
                $ cat someFile.txt
                  >
                

                >> 用于追加

                $ echo ">" > someFile.txt
                $ cat someFile.txt
                  >
                $ echo ">" >> someFile.txt
                $ cat someFile.txt
                  >>
                

                【讨论】:

                  【解决方案10】:

                  我建议你做两件事:

                  1. 在您的 shell 脚本中使用 &gt;&gt; 将内容附加到特定文件。文件名可以固定或使用某种模式。
                  2. 设置每小时 cronjob 以触发 shell 脚本

                  【讨论】:

                    【解决方案11】:

                    例如,您的文件包含:

                     1.  mangesh@001:~$ cat output.txt
                        1
                        2
                        EOF
                    

                    如果你想在文件末尾追加,那么---->记住“文本”之间的空格>>“文件名”

                      2. mangesh@001:~$ echo somthing to append >> output.txt|cat output.txt 
                        1
                        2
                        EOF
                        somthing to append
                    

                    并覆盖文件内容:

                      3.  mangesh@001:~$ echo 'somthing new to write' > output.tx|cat output.tx
                        somthing new to write
                    

                    【讨论】:

                    • 这在很多细节上都具有误导性。空格很重要,并且将空输出传送到cat 是......完全古怪。 (它是空的,因为您刚刚将标准输出重定向到一个文件。)
                    【解决方案12】:

                    虽然所有这些答案在技术上都是正确的,但使用 &gt;&gt; 附加到文件通常是可行的方法,但请注意,如果您在循环中使用它,例如解析/处理文件并将每一行附加到结果文件,这可能比您预期的要慢得多。

                    一个更快的选择可能是这样的:

                    stringBuilder=""
                    while read -r line; do
                      # $'\n' prints a newline so we don't have to know what special chars the string contains
                      stringBuilder+="$line"$'\n'
                    done < "myFile.txt"
                    echo "$stringBuilder" > $file
                    

                    警告:您正在将所有行读入内存;内存是有限的资源,所以不要为巨大的文件这样做。

                    【讨论】:

                      猜你喜欢
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 2023-04-04
                      相关资源
                      最近更新 更多