2013-02-05 116 views
1

我想從stdin讀取數據,併爲每個解析的行執行shell命令並恢復其輸出。awk:如何執行命令並讀取其輸出

這裏幾乎工作的例子:

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

命令「日期+%s」的執行,我可以恢復輸出,但它看起來對我來說,執行只發生一次,而不是每比賽。

最終目的是將輸出交給rrdtool進行存儲,rrdtool需要每個記錄的時間戳。

@Ed Morton,除了指出一個可行的解決方案之外,還提到了帶有內置時間函數的gawk。這是最優雅的解決方案。

[[email protected]] # ping eulbi001 | awk -F'[ =]' '/64 bytes/{print systime(),$11}' 
1360069298 0.056 
1360069298 0.051 
1360069298 0.051 
+0

每行都會調用日期,但所有輸出都在1秒內被解析。 –

+0

對不起,不明白你的評論。如果每行都執行日期,那麼我應該看到變量D也增加了。 –

+0

如果每次打電話給日期,都不會發生在與上次打電話日期相同的秒鐘內。你告訴日期打印自紀元以來的秒數,因此D只會每秒更改一次,而不是每次你打電話給日期。 –

回答

3

以防萬一還有另一個函數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的內置時間函數,所以你根本不需要處理這些東西。

+0

謝謝! '關閉'做到了! –