ChatGPT解决这个技术问题 Extra ChatGPT

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

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


a
aioobe

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

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 的一部分,并且示例中没有转义序列。
c
craft

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


w
walta

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

要测试这个尝试运行:

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

这样做几次,然后运行:

cat textfile.txt

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


c
craft

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

例如 echo "Hello" >> testFile.txt

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

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

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


v
victortv

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

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

这个 thread 对 tee 有很好的回答


这是用新行追加内容的最佳方式。
正在寻找一种附加到受保护文件的方法,这解决了它
N
Nev Stokes

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


S
Saurav Sahu

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

> 用于覆盖

$ 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
  >>

c
clt60

对于整个问题:

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

B
Braden Holt

我会使用 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

s
sballmer

我建议你做两件事:

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


T
Torsten

例如,您的文件包含:

 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 是……完全古怪。 (它是空的,因为您刚刚将标准输出重定向到一个文件。)
L
Leon S.

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

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

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

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