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>&1stderrをstdoutにリダイレクトして、画面と指定されたファイルの両方に出力できるようにしますawktee

awk出力をバッファリングすると、迷惑になることがあります(チャンクで示されています)。次に、次を使用します。

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

または:

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

関連情報