2012-01-30 3 views
0

myfile.log содержит такие вещи, как:шаблона согласования журналов в убунту

----- 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. Например, следующие будут возвращены:

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

Edit: Спасибо за ответы до сих пор, я забыл упомянуть, что мне это нужно, чтобы поток вывода таким же образом tail бы.

+0

можно с уверенностью сказать, что раздел из файла журнала разделен на ... IP-адрес .... пустая строка? или могут быть пустые строки в секции? вы должны иметь возможность принять любое рабочее решение и связать его так же, как 'tail -f logfile | sed ... '. Удачи. – shellter

ответ

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-адресом. 'sed -n/^ ----- [0-9:] * \ (123 \ .123 \ .123 \ .123 \) --- * $ /,/^ ----- * $/p 'yourfile'. (Обратите внимание также на отсутствие скобок вокруг команды 'p', они являются необязательными, когда у вас есть только одно действие.) – tripleee

0

Вы можете использовать grep -A <NUM>. Это будет печатать NUM строк завершающего контекста после соответствующих линий

+0

Спасибо, это не будет работать как количество строк между IP-адресом и' ----- ----------------------------- 'может варьироваться. – Sam

Смежные вопросы