问题描述
如何将命令的输出保存到文件?
没有使用任何软件的方法吗?我想知道如何。
最佳解决方法
是的,这是可能的,只是将输出重定向到一个文件:
someCommand > someFile.txt
或者如果你想追加数据:
someCommand >> someFile.txt
如果你想stderr
也使用这个:
someCommand &> someFile.txt
或者这附加:
someCommand &>> someFile.txt
次佳解决方法
要将命令的输出写入文件,基本上有10种常用的方法。
概述:
Please note that the
n.e.
in the syntax column means “not existing”.
There is a way, but it’s too complicated to fit into the column. You can find a helpful link in the List section about it.
|| visible in terminal || visible in file || existing
Syntax || StdOut | StdErr || StdOut | StdErr || file
==========++==========+==========++==========+==========++===========
> || no | yes || yes | no || overwrite
>> || no | yes || yes | no || append
|| | || | ||
2> || yes | no || no | yes || overwrite
2>> || yes | no || no | yes || append
|| | || | ||
&> || no | no || yes | yes || overwrite
&>> || no | no || yes | yes || append
|| | || | ||
| tee || yes | yes || yes | no || overwrite
| tee -a || yes | yes || yes | no || append
|| | || | ||
n.e. (*) || yes | yes || no | yes || overwrite
n.e. (*) || yes | yes || no | yes || append
|| | || | ||
|& tee || yes | yes || yes | yes || overwrite
|& tee -a || yes | yes || yes | yes || append
列表:
-
command > output.txt
标准输出流将仅被重定向到文件,它在终端中将不可见。如果文件已经存在,它会被覆盖。 -
command >> output.txt
标准输出流将仅被重定向到文件,它在终端中将不可见。如果文件已经存在,新的数据将被附加到文件的末尾。 -
command 2> output.txt
标准错误流将仅被重定向到文件,它在终端中将不可见。如果文件已经存在,它会被覆盖。 -
command 2>> output.txt
标准错误流将仅被重定向到文件,它在终端中将不可见。如果文件已经存在,新的数据将被附加到文件的末尾。 -
command &> output.txt
标准输出和标准错误流都将被重定向到文件,终端上不会显示任何内容。如果文件已经存在,它会被覆盖。 -
command &>> output.txt
标准输出和标准错误流都将被重定向到文件,终端上不会显示任何内容。如果文件已经存在,新的数据将被附加到文件的末尾。 -
command | tee output.txt
标准输出流将被复制到文件中,它仍将在终端中可见。如果文件已经存在,它会被覆盖。 -
command | tee -a output.txt
标准输出流将被复制到文件中,它仍将在终端中可见。如果文件已经存在,新的数据将被附加到文件的末尾。 -
(*)Bash没有简写语法,只允许将StdErr连接到第二个命令,这需要再次与
tee
结合才能完成表格。如果您真的需要这样的东西,请查看“How to pipe stderr, and not stdout?” on Stack Overflow以了解如何完成此操作的一些方法。通过交换流或使用流程替代。 -
command |& tee output.txt
标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,它会被覆盖。 -
command |& tee -a output.txt
标准输出和标准错误流都将被复制到文件中,同时在终端中仍然可见。如果文件已经存在,新的数据将被附加到文件的末尾。
第三种解决方法
您还可以使用tee
将输出发送到文件:
command | tee ~/outputfile.txt
稍作修改也会引发stderr:
command 2>&1 | tee ~/outputfile.txt
或略短而复杂:
command |& tee ~/outputfile.txt
tee
非常有用,如果您希望能够捕捉命令输出,同时还可以实时查看它。
第四种方法
您可以将命令输出重定向到一个文件:
your_command >/path/to/file
要将命令输出附加到文件而不是覆盖它,请使用:
your_command >>/path/to/file
第五种方法
需要考虑的一项改进 –
各种脚本会在输出中注入颜色代码,您可能不希望混淆日志文件。
要解决这个问题,您可以使用sed程序去除这些代码。例:
command 2>&1 | sed -r 's/'$(echo -e "\033")'\[[0-9]{1,2}(;([0-9]{1,2})?)?[mK]//g' | tee ~/outputfile.txt