awk strftime返回时间

时间:2014-01-18 02:52:20

标签: linux bash shell awk

我正在使用这个漂亮的单行为我的日志文件的每一行添加时间戳:

tail -f log  | grep -a --line-buffered "." | awk '{ print strftime("%s\t"), $0; fflush() }'

不幸的是,在数据点之间需要毫秒分辨率时,它只能提供完整的秒数。是否有同样优雅的解决方案来获取ms时间戳?我不关心自纪元以来的时间,只关注线之间的差异。

谢谢!

3 个答案:

答案 0 :(得分:2)

您可以尝试将替换为及其Time::HiRes内置模块,例如:

tail -f infile | perl -MTime::HiRes=time -ne 'printf "%.3f\t%s", time(), $_'

它产生类似于:

1390014680.197  one
1390014680.197  two
1390014680.197  three
1390014680.197  four
1390014680.197  five
1390014680.197  six
1390014689.414  seven
1390014693.542  eight

答案 1 :(得分:2)

您可以使用awk,但需要对其进行更改:

tail -f log  | grep -a --line-buffered "." | awk '{ print d, $0; fflush() }' d=$(date -Ins)

答案 2 :(得分:1)

awk替换为sed,然后使用$(date -Ins)添加具有纳秒级精度的ISO 8601时间戳。

tail -f infile | grep -a --line-buffered "." | sed 's/^/'"$(date -Ins)\t"'/'

2014-01-18T17:24:08,110459605+1100  one
2014-01-18T17:24:08,110459605+1100  two
2014-01-18T17:24:08,110459605+1100  three

$(date --rfc-3339=ns)替代格式:

tail -f infile | grep -a --line-buffered "." | sed 's/^/'"$(date --rfc-3339=ns)\t"'/'

2014-01-18 17:24:51.985434198+11:00 one
2014-01-18 17:24:51.985434198+11:00 two
2014-01-18 17:24:51.985434198+11:00 three