awk:如何执行命令并读取其输出

时间:2013-02-05 13:04:48

标签: awk

我想从stdin读取数据并为每个已解析的行执行shell命令并恢复其输出。

这是一个几乎有用的例子:

[root@eulbi002] # ping eulbi001 | awk -F'[ =]' '/64 bytes/{"date +%s"|getline D; print D,$11}'
1360069298 0.056
1360069298 0.051
1360069298 0.051

命令'date +%s'被执行,我可以恢复输出,但它看起来像执行只发生一次,而不是每次匹配。

最终目标是将输出交给rrdtool进行存储,rrdtool需要为每条记录设置一个时间戳。

@Ed Morton除了指出一个有效的解决方案外,还提到了内置时间功能的gawk。这是最优雅的解决方案。

[root@eulbi002] # ping eulbi001 | awk -F'[ =]' '/64 bytes/{print systime(),$11}'
1360069298 0.056
1360069298 0.051
1360069298 0.051

1 个答案:

答案 0 :(得分:4)

如果还有另一个获取线的警告(请参阅http://awk.info/?tip/getline),请尝试在每次调用后关闭管道,例如:

ping eulbi001 |
awk -F'[ =]' 'BEGIN{cmd="date +%s"} /64 bytes/{cmd|getline D; close(cmd); print D,$11}'

看看你是否得到不同的结果。你仍然不应该期望D在每次调用时都会改变,只是每一秒。如果您愿意,可以为时间戳的较小粒度添加“。%N”。

更好的是,使用GNU awk和它的内置时间函数,所以你根本不需要处理这些东西。

相关问题