Как напечатать 5 последовательных строк после шаблона в файле с помощью awk - PullRequest
39 голосов
/ 15 марта 2011

Я хотел бы найти шаблон в файле и напечатать 5 строк после нахождения этого шаблона.

Мне нужно использовать awk, чтобы сделать это.

Пример:

Содержимое файла:

.
.
.
.
####PATTERN#######
#Line1
#Line2
#Line3
#Line4
#Line5
.
.
.

Как выполнить синтаксический анализ файла и распечатать только вышеупомянутые строки?Я использую NR строки, которая содержит «PATTERN», продолжаю увеличивать до 5 и печатать каждую строку в процессе.Пожалуйста, дайте мне знать, если в Awk есть какой-нибудь другой эффективный ват.

Ответы [ 7 ]

54 голосов
/ 15 марта 2011

Другой способ сделать это в 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

Символы # представляют счетчик.Используйте на одно число меньше количества строк, которые вы хотите вывести.

14 голосов
/ 15 марта 2011
awk '
{ 
    if (lines > 0) {
        print;
        --lines;
    }
}

/PATTERN/ {
    lines = 5
}

' < input

Это дает:

#Line1
#Line2
#Line3
#Line4
#Line5
12 голосов
/ 15 марта 2011

grep "PATTERN" search-file -A 5 выполнит эту работу за вас, если вы решите дать grep шанс.

Редактировать: Вы можете вызвать grep с помощью функции system() из скрипта awk.

8 голосов
/ 24 февраля 2016

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
7 голосов
/ 15 марта 2011

Редактировать: не заметил 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}'

Читается как a стремится к 0. / qmaild / устанавливает значение 5 : -)

0 голосов
/ 02 сентября 2013

Ограничено решением Johnsyweb, но используется другой подход и расширенная функция GNU awk, позволяющая использовать полные разделители записей RegEx, что приводит к куску кода, который, IMHO, очень awk -ish:

awk -F\\\n '{NF=5}NR-1' RS="PATTERN[^\n]*." OFS=\\\n

Так что, если вы хотите стабильное решение, которое также читабельно, согласитесь с ответом Денниса Уильямсона (+1 за это), но, возможно, вы слишком просто наслаждаетесь красотой awk, глядя на подобные строки.

0 голосов
/ 15 марта 2011

Быстрое и грязное решение: awk '/PATTERN/ {i=0} { if (i<=5) {print $0}; i+=1} BEGIN {i=6}'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...