Как grep для текста в файле и отображать абзац с текстом?

Ниже приведен текст в файле:

Pseudo name=Apple Code=42B state=fault Pseudo name=Prance Code=43B state=good 

Мне нужно grep для «42B» и получить вывод из вышеприведенного текста, например:

 Pseudo name=Apple Code=42B state=fault 

Кто-нибудь имеет представление о том, как достичь этого, используя grep / awk / sed ?

5 Solutions collect form web for “Как grep для текста в файле и отображать абзац с текстом?”

С awk

 awk -v RS='' '/42B/' file 

RS= изменяет разделитель входных данных с новой строки на пустые строки. Если какое-либо поле в записи содержит /42B/ печатает запись.

'' (пустая строка) является магическим значением, используемым для представления пустых строк в соответствии с POSIX :

Если RS является нулевым, то записи разделяются последовательностями, состоящими из <newline> плюс одна или несколько пустых строк, пустые или конечные пустые строки не должны приводить к пустым записям в начале или конце ввода, а <newline> всегда быть разделителем полей, независимо от значения FS .

Выходные абзацы не будут разделены, так как выходной разделитель останется одной новой строкой. Чтобы убедиться, что между выводами есть пустая строка, установите разделитель выходной записи в две строки:

 awk -v RS='' -v ORS='\n\n' '/42B/' file 

Предполагая, что данные структурированы так, что это всегда строка до и после этого, вы хотите, чтобы вы могли использовать переключатели gre- -A (после) и -B (до), чтобы сообщить ей, чтобы она включала 1 строку перед совпадением и 1 строку после Это:

 $ grep -A 1 -B 1 "42B" sample.txt Pseudo name=Apple Code=42B state=fault 

Если вы хотите, чтобы те же номера строк были до и после поискового запроса, вы можете использовать переключатель -C (context):

 $ grep -C 1 "42B" sample.txt Pseudo name=Apple Code=42B state=fault 

Если вы хотите быть более строгим при сопоставлении нескольких строк, вы можете использовать инструмент pcregrep для соответствия шаблону по нескольким строкам:

 $ pcregrep -M 'Pseudo.*\n.*42B.*\nstate.*' sample.txt Pseudo name=Apple Code=42B state=fault 

Вышеупомянутый шаблон соответствует следующему:

  • -M – несколько строк
  • 'Pseudo.*\n.*42B.*\nstate.*' – соответствует группе строк, где первая строка начинается со слова "Pseudo" за которой следуют любые символы до конца строки \n , за которыми следуют любые символы до строки "42B" за которой следуют любые символы до другого конца строки ( \n ), за которым следует строка "state" за которой следуют любые символы.

Вероятно, такой же простой способ сделать это с awk, но в perl:

 cat file | perl -ne 'BEGIN { $/="\n\n" }; print if $_ =~ /42B/;' 

Это в основном говорит о том, чтобы разделить файл на куски, разделенные пустыми строками, а затем распечатать только те куски, которые соответствуют вашему регулярному выражению.

В grep некоторых разновидностей Unix есть флаг -p для «абзаца». Я знаю, что AIX .

 grep -p 42B <myfile> 

будет делать именно то, что вы просите там. У YMMV и GNU grep этот флаг отсутствует.

Другое решение perl без пустой строки:

 perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo 

пример

 % perl -00ne 'if ($_ =~ /42B/) {chomp($_); printf "%s\n",$_}' foo Pseudo name=Apple Code=42B state=fault % cat foo Pseudo name=Apple Code=42B state=fault Pseudo name=Prance Code=43B state=good 
  • Удалить обратную косую черту + последовательности новой строки
  • Используйте sed, чтобы хранить только части файла и изменять его порядок (на основе синтаксиса textWrangler grep)
  • Заменяйте символы по определенному индексу, отсчитываемому сзади
  • Присоедините произвольные строки для вывода в виде одной строки
  • Печатать текст между тегами (включительно), если обнаружен определенный текст
  • Замена нескольких звездочек в vi
  • Как удалить пробелы в столбцах?
  • Замена шаблона соответствия совпадению с помощью sed
  • Сценарий оболочки для назначения значений из таблицы поиска слишком медленный
  • Sed: Заменить N первых вхождений персонажа
  • как совместить все между строкой и перед следующим пространством
  • Interesting Posts

    Какие аппаратные компоненты не требуют драйвера и почему

    Запуск bzImage в QEMU: невозможно монтировать root fs на неизвестном блоке (0.0)

    Lubuntu 16.10 (32-разрядная, i386) загрузка на Dell Inspiron 1525

    В разделе меню панели инструментов LXDE доступны категории и элементы приложения?

    Индивидуальный формат писем Bugzilla

    Fedora 25 Live Persistent Overlay не работает

    Статический IP-адрес для Wi-Fi Centos 7

    как вставить несколько файлов вместе, используя одно пространство в качестве разделителя

    Невозможно восстановить или удалить файл в файловой системе ext4

    Stunnel 5.4 на Centos

    Автоматическое определение правильных разрешений для определенного типа файла при копировании файла из файловой системы, отличной от Linux

    Как отображать вывод команды во время ее разбора?

    ip-туннель от подсети к локальному хосту

    "/ Sbin / yast: fork: Невозможно выделить память" на openSUSE 10.1

    нижняя граница скорости загрузки в wget

    Linux и Unix - лучшая ОС в мире.