2013-07-16 48 views
-2

我試圖從星號日誌中實時摘取電話號碼。我使用tail來做到這一點,問題是從我所知道的是,grep使用行緩衝,因爲尾巴沒有結束它等待尾部刷新,但我需要通過系統來的數字。這裏是我的代碼如何關閉grep行緩衝

tail -f /var/log/asterisk/messages | grep @default | awk -F ' ' '{ print $11 }' | awk -F '[^0-9]*' '{ print $2 }' 

我也想確保它返回的模式也是一個10位的數字,因爲它代表它是返回較小的1-6位數字。

在此先感謝

TrueY: 接近於:這裏是一個例子,即時通訊設法過濾

[Jul 17 12:11:00] VERBOSE[13992] logger.c: [Jul 17 12:11:00]  -- Executing [[email protected]:1] DeadAGI("Local/[email protected],2", "agi://127.0.0.1:4577/call_log--HVcauses--PRI-----NODEBUG-----0-----CANCEL----------") in new stack 

什麼,我想要做的是拉的10位電話號碼的數據緊隨 '@default'

+1

我不認爲您理解「行緩衝」.GGp每次緩衝一行,並檢查並打印如果它看到換行符,它就會(如果匹配的話)。對於許多正則表達式類型,無論如何都不可能判斷該行是否匹配,直到換行符。 – Kevin

+2

另外,'grep | awk'是多餘的,兩個'awk'也是多餘的。 s;使用'tail -f ... | awk -F'''/ @ default/{split($ 11,a,/ [0-9] + /); print a [2]}''。除非你需要兩個空格在它們之間創建一個空的字段,放下'-F'''。 – Kevin

+0

@Kevin:我認爲在你的解決方案中,$ 11被一個數字分割,但是在OPs的例子行中應該被一個非數字分割(如果我理解他的目標的話)。 – TrueY

回答

2

改進#2

其實之前tail不是實時的。它默認每1秒檢查一次新值(更改-s選項)。

我改進了Kevin的答案有點。 !我認爲第12場(而不是11日)包含數字(「DeadAGI(」本地/ 91201xxx0249 @默認abb1,2" ,」 - 這是不是10位我認爲它是):

tail -f /var/log/asterisk/messages | 
awk 'match($12, /[^0-9]91([0-9]{10})@default/, a) {print a[1]}' 

如果行中包含「@default」並且第12個字段包含正好10個連續數字,則只會打印。

+0

@ Iz3k34l:我改進了我的答案。這個數字應該從「DeadAGI(」部分?)中提取出來,它是第12個字段,不是嗎?它也是連續的10個數字或者有非數字字符? – TrueY

+0

實際上有12個連續數字,9是一個未使用的字符,後來在另一個進程中被剝離,然後1再次在另一個進程中被剝離,因此所有與之有關的im都是9和1之後的10個數字。該數字並不總是遵循「DeadAGI」,但總是先於文本「@default」以某種方式再次感謝您的幫助 – Iz3k34l

+0

@ Iz3k34l:Ok!相應地修改如果未確定哪個字段包含此值,請將$ 12改爲$ 0,它將解析整行,而不僅僅是第12場。 – TrueY