Shell
為命令的每一行輸出添加時間戳
我希望在命令的每一行輸出前面加上一個時間戳。例如:
foo bar baz
會成為
[2011-12-13 12:20:38] foo [2011-12-13 12:21:32] bar [2011-12-13 12:22:20] baz
…前綴的時間是列印該行的時間。我怎樣才能做到這一點?
moreutils包括
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]
用於微秒精度。
首先,如果您希望這些時間戳實際代表一個事件,請記住,由於許多程序執行行緩衝(有些比其他程序更積極),因此將其視為接近原始行的時間很重要被列印出來,而不是正在發生的動作的時間戳。
您可能還想檢查您的命令是否還沒有專門用於執行此操作的內置功能。例如,
ping -D
存在於某些ping
版本中,並在每行之前列印自 Unix 紀元以來的時間。但是,如果您的命令不包含自己的方法,則可以使用一些方法和工具,其中包括:POSIX 外殼
請記住,由於許多 shell 在內部將其字元串儲存為 cstrings,如果輸入包含空字元 (
\0
),則可能會導致該行過早結束。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 }'
Perl
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] ")'