grep pattern следующие две строки и отбросить шаблон с одной строкой

grep pattern следующие две строки и отбросить шаблон с одной строкой

У меня есть файл примерно такого вида:

dn: данан

cn: датский

cn: danian1


DN: danian2

cn: danian2


DN: danian3

cn: danian3

cn: danian4

все, что я хочу сделать, это выполнить grep по шаблону "dn:" и вывести только следующие 2 строки, но когда я запускаю grep -A 2 "dn:", результатом будет все, что есть в файле, я просто хочу вывести следующие 2 строки, а не одну следующую строку

решение1

Это может сработать:

$ awk -v RS="dn: " -v FS="\n" -v ORS="" 'NF>3 {print "dn:",$0}' input.txt

Мы определяем dn:как разделитель записей. Поля в одной записи разделяются символом новой строки \n.

В случае, если у вас есть две строки после строки, начинающейся с dn:, перед тем, как новая запись начнется с dn:, у вас будет 3 раза "\n", что приведет к 4 полям в записи. Вот почему мы проверяем, есть ли в записи больше 3 полей ( NF>3). Если это так, мы печатаем всю запись, но нужно добавить dn:.

Обратите внимание, что это NF>3найдет все записи с более чем двумя следующими строками в одной записи. Если вы хотите только те, у которых ровно две, измените это на NF==3.

Если блоки разделены пустой строкой (как это видно из одного из ваших последующих комментариев), используйте вместо этого следующее:

$ awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' input.txt

решение2

Я запускаю команду выше и она работает отлично,

awk -v RS="\n\n" -v FS="\n" -v ORS="\n\n" 'NF>2 {print $0}' 

разграниченные блоки пустые, работает отлично.

Связанный контент