我想在设备sda的iostat输出前加上时间戳。男:S就够了.然而,这似乎并不那么简单。我的第一次尝试只是:
# vi just_echo
mystamp=$(date '+%Y-%m-%d %H:%M:%S')
cat /dev/stdin | grep sda | sed "s/sda/$mystamp/"
# iostat 5 | ./just_echo 然而,这不会产生任何输出。如果我删除sed,我确实得到了一些输出,但是这里发生了什么呢?
发布于 2018-09-18 14:25:26
根据https://meta.stackexchange.com/questions/172307/duplicate-questions-on-other-se-sites
这里回答了问题。
多用包括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。
如果您希望不使用ts的不同方法:
请记住,由于许多shell将其字符串内部存储为cstring,如果输入包含空字符(\0),则可能导致行过早结束。
command | while IFS= read -r line; do printf '[%s] %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$line"; donecommand | 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'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] ")'https://serverfault.com/questions/931504
复制相似问题