Как 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 или AWK для перемещения строки в новый столбец и строку
  • Добавление / удаление некоторых вкладок и разрывов строк в HTML-коде с помощью sed
  • Замените все буквы словом «*» после определенного слова в текстовом файле
  • Как удалить несколько пустых строк из файла?
  • Как найти и заменить значение столбца поля в UNIX
  • копировать и вставлять текст с конца строки
  • Удалить комментарии в файле C
  • Я бы хотел использовать одну из трех команд sed (диапазоны чисел)
  • awk + как добавить список в файл
  • Удаление прокомментированных строк в текстовом файле с помощью sed
  • Удаление определенных строк и дубликатов из текстового файла текстового слова 11gb
  • Linux и Unix - лучшая ОС в мире.