2012-01-30 60 views
0

myfile.log包含了諸如:模式在Ubuntu匹配日誌

----- 12:08:12 (123.123.123.123) -------------------------------- 
Some code here... 
This section has no specified length... 
----------------------------------------------------------------- 


----- 12:10:15 (254.14.187.123) -------------------------------- 
Some code here... 
This section has no specified length... 
It could be 3 lines, or 4 lines, or 20 lines. 
----------------------------------------------------------------- 

我想使用類似的grep拉出包含IP地址123.123.123.123每個塊。例如,以下將返回:

​​

編輯: 謝謝你的答案到目前爲止,我忘了提,我需要它流輸出以同樣的方式tail會。

+0

是否可以安全地聲明日誌文件中的某個部分由...分隔... IP地址....空行?或者在某一節中可能有空行?你應該能夠採取任何可行的解決方案,並將其鏈接成'tail -f logfile | sed ...'。祝你好運。 – shellter 2012-01-30 14:16:47

回答

2

我會使用類似的東西:

sed -n '/^-----.*(123\.123\.123\.123) ---/,/^------/p' file.log 

它首先匹配的線,開始用5個連字符,則包含了一些任意字符,那麼IP地址用圓括號括起來,後面跟一些連字符。然後,它會匹配所有行,直到遇到以5個連字符開頭的行。您可以使用/^-\{5,\}$/指定僅包含連字符的行(至少5)。

關於你的問題的編輯:與流我假設你的意思tail -f?只需將其輸出轉換爲sed即可:

tail -f file.log | sed -n '/^-----.*(123\.123\.123\.123) ---/,/^------/p' 
1

這是否給你你想要的?

sed -n '/123\.123\.123\.123/,/^-*$/{p}' yourFile 
+1

如果某些數據部分也可能與IP地址匹配,您可能希望使開始的regex更嚴格。 'sed -n/^ ----- [0-9:] * \(123 \ .123 \ .123 \ .123 \)--- * $ /,/^----- * $/p 'yourfile'。 (注意''p'命令周圍沒有括號,當你只有一個動作時它們是可選的。) – tripleee 2012-01-30 13:24:14

0

您可以使用grep -A <NUM>。這將打印NUM行後的上下文匹配的行

+0

謝謝,這不會作爲IP地址和'----- -----------------------------'可以改變。 – Sam 2012-01-30 12:58:31