2013-05-01 46 views
7

我正在啓動一個網站,並且我想設置一個Bash單行程,所以當有人點擊該站點時,會使用內部蜂鳴器發出嘟嘟聲。'tail -f'在通過grep傳輸時不會給出單行'

到目前爲止,它正在使用以下內容。

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

尾遵循訪問日誌和轉儲到標準輸出,得到標準輸出線的時間,回聲「\ 007」「內部嘟十六進制代碼」,並做了線......

這很像一個美女......每一擊都會顯示日誌中的線條和嗶嗶聲...但是,它非常快速令人討厭,所以理想情況下,我想在將其輸入while之前過濾tail -f /access/log,以便只讀獲得我關心的線條。我想grep "/index.php"將是遊客的一個很好的跡象...

這就是問題...

我可以做...

tail -f access_log | while read x ; do echo -ne '\007' $x '\n' ; done 

蜂鳴聲的一切 和我可以做...

tail -f access_log | grep "/index.php" 

和頁面顯示沒有蜂鳴聲,但是當我做

tail -f access_log | grep "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

沒有任何反應,沒有來自日誌的行,沒有嘟嘟聲。

我認爲grep將它搞亂了,但我無法弄清楚它在哪裏。 我喜歡它是一個班輪,我知道它應該在腳本中完成,而且會更容易,但它不能解釋爲什麼我認爲應該工作的上述不是。

+0

你能提供一些示例日誌代碼,我們來看看和勾搭? – Ding 2013-05-01 17:05:23

+0

不幸的是......它充斥着敏感的信息......你可以使用任何access_log,只需選擇一個URL來grep。 – 2013-05-01 17:09:32

+0

它的一個很好的功能,來自單個網頁加載的聲音(蜂鳴聲混合)可以產生大約20-30次嗶嗶聲(日誌中的行)...嗶聲意味着您可以立即知道文件被傳送到什麼位置... – 2013-05-01 17:12:19

回答

14

grep的輸出在管道中使用時會被緩衝。使用--line-buffered強制它使用行緩衝,以便立即輸出行。

tail -f access_log | grep --line-buffered "/index.php" | while read x ; do echo -ne '\007' $x '\n' ; done 

您還可以結合grepwhile環成一個單一的awk電話:

tail -f access_log | awk '/\/index.php/ { print "\007" $0 }' 
+0

愛你...工作就像一個魅力:) – 2013-05-01 17:08:46

+1

現在你的炫耀...將做...從來沒有在awk,但接縫讓我出了很多麻煩,也許有時間給手冊頁一個很好的閱讀...再次感謝你.... – 2013-05-01 17:16:47

7

當標準輸出不是終端時,輸出grep緩衝區。您需要將--line-buffered開關切換至grep,以便在寫入行時強制刷新標準輸出。

+0

愛你...工作就像一個魅力:) – 2013-05-01 17:08:01