2014-02-07 84 views
0

我正在嘗試製作一個能夠觀看某些日誌的腳本。我有一個請求日誌與每個請求格式化這樣的事情,GNU awk中的緩衝區記錄

--- 
id=273482 
Result=Error 
--- 
id=342345 
Result=Success 
--- 

第二個日誌,其中每行都有請求的ID。我需要實時觀看請求日誌並將其與第二個日誌交叉引用。

tail -f requestLog | awk \"BEGIN { RS = \"---\" } /Error/\" | grep --line-buffered id | sed -u ... 

我尾-f requestLog,使用awk在「---」上拆分記錄,然後grep出id行。然後,我將所有內容傳遞給sed -u以提取id和xargs,以便grep第二個日誌中與壞請求相關的行。

問題是結果出來真的延遲了,因爲某些東西(我認爲awk)緩衝錯誤。我怎樣才能使awk讀取輸入不間斷,並在每次看到壞記錄時刷新輸出?順便說一下,我使用的是GNU awk。

回答

2

GNU awk有一個fflush()您可以使用刷新緩衝區:

.. | awk 'BEGIN { RS = "---" } /Error/ { print; fflush(); }' | .. 

有了這個你行緩衝管道中的所有階段。

如果在未來有不支持像AWK fflushgrep --line-bufferedsed -u,GNU的coreutils管道中的任何其他方案有一個更一般的stdbuf您可以用任何程序中使用:

.. | stdbuf -o 0 any_other_command | .. 
0

這裏是修復

tail -f requestLog|awk 'BEGIN{RS="--*"}/Error/{split($1,a,"=");print a[2]}'