
У меня есть файл примерно такого вида:
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}'
разграниченные блоки пустые, работает отлично.