![在 iostat 前面加上当前时间](https://linux22.com/image/727264/%E5%9C%A8%20iostat%20%E5%89%8D%E9%9D%A2%E5%8A%A0%E4%B8%8A%E5%BD%93%E5%89%8D%E6%97%B6%E9%97%B4.png)
我想iostat
为设备添加输出前缀星展银行带有时间戳。年日 时:分:秒就足够了。然而,这似乎不那么简单。我的第一次尝试很简单:
# 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
我会得到一些输出,但是这里发生了什么?
答案1
按照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
:
POSIX 外壳
请记住,由于许多 shell 将其字符串在内部存储为 cstring,因此如果输入包含空字符 ( \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] ")'