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