sed и grep получают номер строки для совпадения

у меня есть файл журнала, и я использую sed для извлечения строк между двумя строками, которые содержат слово MATCH. Я использую sed для извлечения строк, а grep - только строки, содержащие слово "MATCH". Мне нужен номер строки в файле журнала, где найдено совпадение.

Date:...
TST STARTS
DISCARD str1
DISCARD str2
MATCH str3 //line 5
MATCH str4 //line 6
DISCARD str5
TST FINISHED

Я использую эту команду для извлечения строк:

sed -n "/TST STARTS/,/TST FINISHED/p" log.txt | grep "MATCHED".

мой вывод такой:

MATCH str3
MATCH str4

но мне также нужно на выходе номер строки:

line 5: MATCH str3
line 6: MATCH str4

3 ответов


вы можете использовать:

cat -n

чтобы пронумеровать строки, прежде чем применять sed, вот так:

cat -n log.txt | sed -n "/TST STARTS/,/TST FINISHED/p" | grep "MATCHED"

кроме того, вы можете заменить cat -n вариант nl:

nl -n ln log.txt | sed ...

sed -n '/TST STARTS/,/TST FINISHED/ {
   /MATCH/ {
      =;p
      }
   }' log.txt

номер строки, чем содержание строки на следующую строку

| sed "/^[0-9]/ { 
  N
  s/^\(.*\)\n/line :/
   }"

для включения на одной строке (может быть сделано в 1 sed, но огромный скрипт и плохая производительность в этом случае, событие с отзывом из оболочки проще со вторым sed). Также может быть don с предыдущей нумерацией строки


моя первая попытка не сохраняла номер строки, потому что sed часть удаляет некоторые строки.

все, что можно сделать с этим awk:

$ awk '/TST STARTS/ {p=1} p && /MATCH/ {print "line "NR" --> "}; /TST FINISHED/ {p=0}' a
line 5 --> MATCH str3 //line 5
line 6 --> MATCH str4 //line 6
  • '/TST STARTS/ {p=1} устанавливает флаг p=1 так что отныне будут учитываться все строки.
  • p && /MATCH/ {print "line "NR" --> "} если флаг p активен, и строка содержит MATCH, затем он печатает информацию.
  • /TST FINISHED/ {p=0} выключает флаг при поиске TST FINISHED текст.