コマンドの各出力行の前にタイムスタンプを追加したいと思います。たとえば、
foo
bar
baz
なります
[2011-12-13 12:20:38] foo
[2011-12-13 12:21:32] bar
[2011-12-13 12:22:20] baz
...プレフィックス時間は行が印刷された時間です。この目標をどのように達成できますか?
答え1
その他のユーティリティ次のような優れた作業を行いますts
。
command | ts '[%Y-%m-%d %H:%M:%S]'
また、ループは必要なく、各出力ラインにはタイムスタンプがあります。
$ echo -e "foo\nbar\nbaz" | ts '[%Y-%m-%d %H:%M:%S]'
[2011-12-13 22:07:03] foo
[2011-12-13 22:07:03] bar
[2011-12-13 22:07:03] baz
再起動したサーバーがいつ戻ってくるのか知りたいですか?ただ実行するとping | ts
問題が解決します。 :D。
ノート:[%Y-%m-%d %H:%M:%.S]
マイクロ秒精度に使用されます。
答え2
まず、これらのタイムスタンプが実際にイベントを表すと予想している場合は、多くのプログラムがラインバッファリングを実行するので(一部は他のプログラムよりも積極的に)、それを元のラインの時間に近づけることが重要であることに注意してください。発生したジョブのタイムスタンプの代わりに印刷されます。
また、コマンドにこれを実行するための機能がまだ組み込まれていないことを確認することもできます。たとえば、いくつかのバージョンにping -D
存在し、ping
各行の前にUnix時代以降の時間を印刷します。ただし、コマンドに独自のメソッドが含まれていない場合は、次のようないくつかのメソッドとツールがあります。
POSIXシェル
\0
多くのシェルは文字列を内部的にcstringとして格納しているため、入力にNULL文字()が含まれている場合は行が早く終わることがあることに注意してください。
command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; done
GNU awk
command | gawk '{ print strftime("[%Y-%m-%d %H:%M:%S]"), $0 }'
真珠
command | perl -pe 'use POSIX strftime; print strftime "[%Y-%m-%d %H:%M:%S] ", localtime'
Python
command | python -c 'import sys,time;sys.stdout.write("".join(( " ".join((time.strftime("[%Y-%m-%d %H:%M:%S]", time.localtime()), line)) for line in sys.stdin )))'
ルビー
command | ruby -pe 'print Time.now.strftime("[%Y-%m-%d %H:%M:%S] ")'
答え3
行ごとの増分測定の場合は、以下を試してください。日時計針。
これは、他のコマンドの標準出力にタイムスタンプ情報を追加するためのmoreutilsのtsに似たコマンドラインユーティリティです。これは、長い時間がかかることを望む長期実行プロセスに役立ちます。
gnomonに何かをパイプすると、その行がバッファの最後の行だった時期、つまり次の行が表示されるのにかかる時間を示すタイムスタンプが各行の前に追加されます。デフォルトでは、gnomonは各行間の経過時間(秒単位)を表示しますが、これは設定可能です。
答え4
2024年に更新
以下に説明する素晴らしいプログラムはets
2020年以降更新されていないため、2024年4月現在、次回から更新されたフォークをインポートすることを検討できます。https://github.com/gdubicki/etsそして新しいバージョンをリリースしました。
元の答え
この問題を解決するために、私が書いたばかりのプラグです。ets
、Goで書かれています。
プロジェクトページでさまざまな使用例を見つけることができます。
従来の回答と同様の製品との重要な違いは、ets
pty(pseudo-tty)でコマンドを実行するように設計されていることです。つまり、コマンドがデフォルトでttyで実行されることをエミュレートします。ts
これは、タイムスタンプをデフォルトで透過的にし、パイピングコマンドの出力と比較して、次のパイピングの問題を解決します。
- 一部のプログラムはパイプに書き込むときに積極的にバッファリングするため、出力はまったく表示されず、その後は多くの出力が表示されません(たとえば、stdbufを使用でき、stdbufとtsをaliases / functionsにラップすることもできますが、すぐにはそうではありません)。うまくいけば良いです)。
- 一部のプログラムは、パイプに書き込むときに色や相互作用を無効にします。
- ETCを有効にしないと、終了ステータスは消えます。
コマンドは直接実行できます。つまり、ets
既存のコマンドラインの前にコマンドを追加したり、シェルコマンドにすることができます(上記のgifを参照)。もちろん、出力をパイプしたい場合ets
でもそうすることができます。
ets
moreutilsと同じタイムスタンプモードts
(絶対時間モード、経過時間モード、増分時間モード)をサポートします。より合理的なデフォルト値を使用します(たとえば、鍛造時計は常に経過/増分タイムスタンプに使用されます)、カスタムタイムゾーンの追加サポートがあります。詳細な比較があります。ここ。
また、https://github.com/zmwangx/ets。試してみて、バグを報告するなどの作業をしてみてください。