awk:如何执行命令并读取其输出
我想从stdin读取数据,并为每个解析的行执行shell命令,并恢复其输出 下面是一个几乎有效的示例:awk:如何执行命令并读取其输出,awk,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'已执行,我可以恢复输出,但在我看来,执行仅发生一次,而不是每次匹配 最终目的是将
[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
为了防止这里出现另一个getline警告(请参阅),请尝试在每次调用后关闭管道,例如:
ping eulbi001 |
awk -F'[ =]' 'BEGIN{cmd="date +%s"} /64 bytes/{cmd|getline D; close(cmd); print D,$11}'
看看你是否得到了不同的结果。但是,您仍然不应该期望在每次调用时,仅仅是每秒钟,都会发生更改。如果愿意,您可以为时间戳的更小粒度添加“.%N”
更好的是,将GNU awk与它的内置时间函数一起使用,这样您就根本不需要处理这些问题。为了防止这里出现另一个getline警告(请参阅),请尝试在每次调用后关闭管道,例如:
ping eulbi001 |
awk -F'[ =]' 'BEGIN{cmd="date +%s"} /64 bytes/{cmd|getline D; close(cmd); print D,$11}'
看看你是否得到了不同的结果。但是,您仍然不应该期望在每次调用时,仅仅是每秒钟,都会发生更改。如果愿意,您可以为时间戳的更小粒度添加“.%N”
更好的方法是,将GNU awk与它的内置时间函数一起使用,这样您就根本不需要处理这些问题。每行都会调用date,但所有输出都会在1秒内解析。抱歉,不理解您的评论。如果对每一行执行date,那么我应该看到变量D也会增加。如果每次调用date时它与上次调用date时在同一秒内,则不会增加。你告诉date打印从纪元开始的秒数,所以D只会每秒更改一次,而不是每次调用date..ping每秒会给我一行新行,所以日期也应该每秒运行一次,这在我上面的测试中不是这样的。这是我在这里提出此问题的唯一原因。每一行都会调用date,但所有输出都会在1秒内解析。抱歉,不理解您的评论。如果对每一行执行date,那么我应该看到变量D也会增加。如果每次调用date时它与上次调用date时在同一秒内,则不会增加。你告诉date打印从纪元开始的秒数,所以D只会每秒更改一次,而不是每次调用date..ping每秒会给我一行新行,所以日期也应该每秒运行一次,这在我上面的测试中不是这样的。这是我在这里提出这个问题的唯一原因。