![如何输出 stdout 和 stderr 并将它们写入文件?](https://linux22.com/image/116134/%E5%A6%82%E4%BD%95%E8%BE%93%E5%87%BA%20stdout%20%E5%92%8C%20stderr%20%E5%B9%B6%E5%B0%86%E5%AE%83%E4%BB%AC%E5%86%99%E5%85%A5%E6%96%87%E4%BB%B6%EF%BC%9F%20.png)
我基本上想将我的 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}'