tee で書かれた各行の前に現在の日付と時刻を付けることはできますか?

tee で書かれた各行の前に現在の日付と時刻を付けることはできますか?

長い bash コマンドの結果をファイルにキャプチャするために、「tee」コマンドを使用しています。

tee で出力したファイルで、各行の先頭に、その行が書き込まれたときのタイムスタンプを付ける方法はありますか? 各行に同じ値が付くのではなく、各行に異なる日時値が付くソリューションを探しています。

これが必要な理由は、後でファイルを読み込んで遅い領域がどこにあるかを把握するときに、各行がいつ発行されたかを知ることが非常に役立つからです。

答え1

tee が何かを実行できない場合は、それを実行するプログラムにパイプします。もっと見るという名前のツールがありts、その目的はまさにこれです:

$ エコーテスト | ts
2月2日 13:17:27 テスト

タイムスタンプを付けたい場合すべて使い方は明らかです:

myapp | ts | tee app.log

他の組み合わせも可能です。たとえば、画面出力のみ、またはログファイルのみにタイムスタンプを付けるには、次のようにします。

myapp | tee app.log | ts
myapp | tee >(ts > app.log)
myapp | tee /dev/tty | ts > app.log
myapp | pee "ts > app.log" "cat"
myapp | pee "cat > app.log" "ts"

(はい、最後のものも moreutils からのものです。)

答え2

代替案ts:

echo "foo" | stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/foo.log"

出力:

# cat "/tmp/foo.log"
2022-02-24 09:43:00 foo

stdout と stderr をファイルに記録する例 (/dev/null端末にも書き込む場合は削除します):

exec &> >(stdbuf -o0 sed 's/%/%%/g' | xargs -d '\n' -I {} date '+%F %T {}' | tee -a "/tmp/std.log" >/dev/null )

もう一つの代替案は以下を使用することですawk:

echo "foo" | xargs -d'\n' -I{} echo '{}' | awk '{ print strftime("%F %T"), $0; fflush(); }' | tee -a "/tmp/foo.log"

関連情報