Как распечатать 5 последовательных строк после шаблона в файле с помощью awk
Я хотел бы найти шаблон в файле и печатать 5 строк после нахождения этого шаблона.
Мне нужно использовать awk
для того, чтобы сделать это.
Пример:
Содержание файла:
.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.
Как мне разобрать файл и напечатать только вышеупомянутые строки? Я использую NR строки, которая содержит "PATTERN", продолжаю увеличивать до 5 и печатать каждую строку в процессе. Пожалуйста, дайте мне знать, если есть другие эффективные ваты, чтобы сделать это в Awk.
Ответы
Ответ 1
Еще один способ сделать это в AWK:
awk '/PATTERN/ {for(i=1; i<=5; i++) {getline; print}}' inputfile
в sed
:
sed -n '/PATTERN/{n;p;n;p;n;p;n;p;n;p}' inputfile
в GNU sed
:
sed -n '/PATTERN/,+7p' inputfile
или же
sed -n '1{x;s/.*/####/;x};/PATTERN/{:a;n;p;x;s/.//;ta;q}' inputfile
Символы #
представляют счетчик. Используйте на одно число меньше количества строк, которые вы хотите вывести.
Ответ 2
awk '
{
if (lines > 0) {
print;
--lines;
}
}
/PATTERN/ {
lines = 5
}
' < input
Это дает:
#Line1
#Line2
#Line3
#Line4
#Line5
Ответ 3
grep "PATTERN" search-file -A 5
выполнит эту работу для вас, если вы решите дать Grep шанс.
Изменить: вы можете вызвать grep, используя system()
функцию из вашего awk
script.
Ответ 4
awk
на помощь!
для печати с помощью строки рисунка (всего 6 строк)
$ awk '/^####PATTERN/{c=6} c&&c--' file
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
чтобы пропустить шаблон и распечатать следующие пять строк
$ awk 'c&&c--; /^####PATTERN/{c=5}' file
#Line1
#Line2
#Line3
#Line4
#Line5
Ответ 5
Изменить: не заметил PATTERN
не должен быть частью вывода.
cat /etc/passwd | awk '{if(a-->0){print;next}} /qmaild/{a=5}'
или
cat /etc/passwd | awk ' found && NR-6 < a{print} /qmaild/{a=NR;found=1}'
Самое короткое, что я могу придумать:
cat /etc/passwd | awk 'a-->0;/qmaild/{a=5}'
Чтение как правило имеет значение 0./qmaild/устанавливает a в 5: -)
Ответ 6
Быстрое и грязное решение: awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'
Ответ 7
Как ограничено, как решение Johnsyweb, но использует другой подход и расширенную функцию GNU awk
, позволяющую полные разделители записей RegEx, приводящие к фрагменту кода, IMHO, очень awk
-ish:
awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n
Итак, если вы хотите стабильное решение, которое также читаемо, согласитесь с ответом Денниса Уильямсона (+1 для этого), но, возможно, вы тоже просто наслаждаетесь красотой awk
при просмотре таких строк.