Журналы сопоставления с образцом в Ubuntu - PullRequest
0 голосов
/ 30 января 2012

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...
-----------------------------------------------------------------

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

Ответы [ 3 ]

2 голосов
/ 30 января 2012

Я бы использовал что-то похожее на:

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 голос
/ 30 января 2012

дает ли это то, что вы хотите?

sed -n '/123\.123\.123\.123/,/^-*$/{p}' yourFile
0 голосов
/ 30 января 2012

Вы можете использовать grep -A <NUM>. Это напечатает NUM строки конечного контекста после сопоставления строк

...