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
текст.