2015-04-07 49 views
0

我有一個不斷更新的日誌文件。 有一個更新文件的功能。 成功操作後,功能會在日誌文件中插入「狀態0」,其他狀態爲1. 我在尋找的是 - 我想編寫一個監視腳本,它將打開此日誌文件並搜索今天的日期和狀態代碼。用於搜索多個圖案的awk命令

請注意 - 沒有這樣明確的日期分隔。昨天和今天的日誌存儲在同一個文件中。

下面

是一個示例代碼我試過,但我想尋找今天的日期作爲受過良好

current_date=`date +%d-%b-%y` 
echo $current_date 
cd /complete/application/logs 

status=`tail -10 agent.log | awk '/"$current_date"/&&/Agent Exited/ {print $0}'` 
echo $status 
if [ "$status" == "<0>" ] 
then 
echo "Log Agent Status on `hostname` is running fine." 
else 
echo "Log Agent status on `hostname` is not running ." 
fi 

請指教。

+0

歡迎來到Stack Overflow。請儘快閱讀[關於]頁面。在這樣的問題中,如果行很長,顯示日誌文件中的幾行或行的截斷版本會很有幫助。您還應該顯示您顯示的數據的預期輸出。沒有這個,我們就盲目工作,不能可靠地幫助你。日誌文件中有多少這樣的行?總共有多少條線路,以及退出狀態的報告數量?爲什麼10行而不是100或1? –

+0

當你在上面的命令中設置狀態時,狀態將如何等於'「<0>」'。它可以是空的或每行匹配。 – 2015-04-07 07:16:28

回答

1

嘗試

awk "/$current_date/ && /Agent Exited/" 

如果你不能馬上看到任何輸出,這可能發生,因爲要去管道時的tail -f GET的標準輸出緩衝。 (這是由libc完成的)。立即在屏幕上

stdbuf -o0 tail -f logfile | awk "/$current_date/ && /Agent Exited/" 

上述命令大小爲零使得輸出的輸出緩衝器執行tail -f出現:

在Linux中,可以使用命令stdbuf調整或禁用此緩衝。對於MacOS和BSD有一個類似的命令。

更新

哦,我錯過了你正在使用tail -10代替tail -f。緩衝問題不應該成爲一個問題,然而,我會保留上述文本以供參考。

+0

感謝您的回覆。 但它沒有返回任何內容:( – Shyam

+1

@klashxx答案是否有效?它應該也是這樣。如果沒有,請發佈我應該匹配的日誌行。 –

+0

實際上,您無法確定日誌文件中最後一行是什麼行。日誌文件不斷更新。需要檢查今天的狀態是o還是1 – Shyam

0

修復引用機制:

status=`tail -10 agent.log | awk '/'"${current_date}"'/&&/Agent Exited/ {print $0}'` 

爲了避免代碼注入肯定會有更好:

awk -v cd="${current_date}" 'match($0,cd) && /Agent Exited/' 

所以您的代碼將是這樣的:

status=`tail -10 agent.log | awk -v cd="${current_date}" 'match($0,cd) && /Agent Exited/'` 

請注意,您忽略print $0,因爲它是awk的defalut動作,當一個快遞離子評估爲true

+0

爲什麼你在這方面使用匹配? '$ 0〜cd'就足夠了, – 2015-04-07 07:18:55

+0

只是更具可讀性@JID – klashxx

+0

不知道我同意但是每個都對自己:) – 2015-04-07 07:27:24