Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk:如何执行命令并读取其输出_Awk - Fatal编程技术网

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

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'已执行,我可以恢复输出,但在我看来,执行仅发生一次,而不是每次匹配 最终目的是将

我想从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

为了防止这里出现另一个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每秒会给我一行新行,所以日期也应该每秒运行一次,这在我上面的测试中不是这样的。这是我在这里提出这个问题的唯一原因。