web-dev-qa-db-ja.com

stdoutをBashのファイルにリダイレクトしながらタイムスタンプを追加する方法は?

プログラム(サーバー)があり、stdoutをすべてファイルにリダイレクト(または複製)し、各エントリのタイムスタンプを追加する方法(スクリプト)を探しています。

私はいくつかの研究を行ってきましたが、私が得られた最も遠いのは STDERRリダイレクトにタイムスタンプを追加する方法 のおかげでした。 stdoutをリダイレクトしますが、追加されるタイムスタンプはスクリプトの終了時のものです:

#!/bin/bash
./server | ./predate.sh > log.txt

predate.shのコード:

#!/bin/bash
while read line ; do
    echo "$(date): ${line}"
done

サーバー出力はプログラムの終了後にフラッシュされるようです(リダイレクトせずに正常に動作します)。また、上記のスレッドの特定の例でpredate.shを使用してみても、完全に機能します。メインプログラムにタイムスタンプを追加するのは簡単ですが、コードの編集は避けたいと思います。

22
wondra

私は最近、まさにそれを必要としていました。シリアルコンソール(picocom)でログメッセージを受信し、それらを端末とファイルに出力し、日付を追加します。

私が今使っているものは、s.thに見えます。このような:

_picocom -b 115200 /dev/tty.usbserial-1a122C | awk '{ print strftime("%s: "), $0; fflush(); }' | tee serial.txt
_
  • picocomの出力はawkにパイプされます
  • awkは、日付を先頭に追加します(_%s_オプションは、時刻を1970-01-01 00:00:00 UTCからの秒数に変換します-または人間が読める形式の場合は_%c_を使用)
  • fflush()バッファリングされた出力をフラッシュ in awk
  • これはteeにパイプされ、ファイルに転送されます。 (teehere に関するいくつかの情報を見つけることができます)
39
oliver

moreutils ts

$ Sudo apt-get install moreutils
$ (echo a;sleep 1;echo b;sleep 3;echo c;sleep 2;echo d;sleep 1) | ts | tee myfile
$ cat myfile
Apr 13 03:10:44 a
Apr 13 03:10:45 b
Apr 13 03:10:48 c
Apr 13 03:10:50 d

またはプログラムの開始からカウント:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -s
00:00:00 a
00:00:01 b
00:00:04 c
00:00:06 d    

またはベンチマークのデルタ:

$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i
00:00:00 a
00:00:01 b
00:00:03 c
00:00:02 d
$ (echo a; sleep 1; echo b; sleep 3; echo c; sleep 2; echo d; sleep 1) | ts -i '%.s'
0.000010 a
0.983308 b
3.001129 c
2.001120 d

参照: stdoutの各行がベンチマークのためにBashの最後の出力行であった時間を監視する方法は?

Ubuntu 18.04、moreutils 0.60でテスト済み。

私にとってあなたのコードは完璧に機能しています

これが私が試したことであることを確認してください

test.sh

#!/bin/bash

while true; do
  echo "hello"
done

predate.sh

#!/bin/bash

while read line; do
  echo $(date) ":" $line;    
done

それから

./test.sh  | ./predate.sh

私にくれます

Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello
Tue Jan 14 17:49:47 IST 2014 : hello

これは、追加に「>」または「>>」を使用して、いくつかのファイルにリダイレクトできます

Check Snapshot

5
Ashish

繰り返しますが、tsからmoreutilsを使用すると、スクリプトの先頭でexecを使用できます。

#!/bin/bash

exec > >(ts>>file.log)

echo hello 1
echo hello 2
sleep 5
echo hello 3
0
nyet