Подтвердить что ты не робот

Как распечатать 5 последовательных строк после шаблона в файле с помощью awk

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

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

Пример:

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

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

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

4b9b3361

Ответ 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 при просмотре таких строк.