如何输出 stdout 和 stderr 并将它们写入文件?

如何输出 stdout 和 stderr 并将它们写入文件?

我基本上想将我的 ping 统计数据写入一个文件。到目前为止,我已经完成了这一点,ping adress | awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}' > textfile但是如果能够查看输出而不必中断之前的过程会更方便。我还知道该命令不会将 stderr 写入我的文本文件中。我在写这个问题时想到了这一部分。

命令或脚本的行为基本上应如下所示:

$ command > textfile [15.08.2017 00:17:07] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. [15.08.2017 00:17:07] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=11.5 ms [15.08.2017 00:17:08] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=11.5 ms ^C $ cat textfile [15.08.2017 00:17:07] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. [15.08.2017 00:17:07] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=44 time=11.5 ms [15.08.2017 00:17:08] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=44 time=11.5 ms

答案1

将命令更改为:

ping address 2>&1 | awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}' | tee textfile

2>&1将 stderr 重定向到 stdout,后者转到awk.tee允许您在屏幕上和指定的文件中同时输出。

awk您可能会对缓冲其输出(将按块显示)感到恼火。然后使用:

awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0; fflush()}'

或者:

stdbuf -oL awk '{ print strftime("[%d.%m.%Y %H:%M:%S]"), $0}'

相关内容