1

我想从标准输入读取数据并为每个解析的行执行一个 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
4

1 回答 1

4

以防万一这里还有另一个 getline 警告(请参阅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 和它的内置时间函数,所以你根本不需要处理这些东西。

于 2013-02-05T15:28:01.720 回答