Добавить пустую строку после каждого результата в grep - PullRequest
15 голосов
/ 25 ноября 2011

моя команда grep выглядит следующим образом: zgrep -B bb -A aa "pattern" *

Я хотел бы получить вывод как:

file1:line1
file1:line2
file1:line3
file1:pattern
file1:line4
file1:line5
file1:line6
            </blank line>
file2:line1
file2:line2
file2:line3
file2:pattern
file2:line4
file2:line5
file2:line6

Проблема в том, что ее трудноразличать, когда начинаются строки, соответствующие первому найденному результату, и строки, соответствующие второму найденному результату.

Обратите внимание, что хотя man grep говорит, что "-" добавляется между непрерывной группой совпадений.Работает только тогда, когда в одном файле найдено несколько совпадений.но в моем поиске (как указано выше) я ищу несколько файлов.

также обратите внимание, что добавление новой пустой строки после каждой строки bb + aa + 1 не будет работать, потому что, если в файле меньше строк bbперед шаблоном.

Ответы [ 5 ]

17 голосов
/ 25 ноября 2011

труба grep выводится через

awk -F: '{if(f!=$1)print ""; f=$1; print $0;}'
1 голос
/ 17 октября 2018

Проблема в том, что трудно различить, когда заканчиваются строки, соответствующие первому найденному результату, и начинаются строки, соответствующие второму найденному результату.

Обратите внимание, что хотя man grep говорит, что "-"добавлено между смежной группой матчей.Работает только тогда, когда в одном файле найдено несколько совпадений.но в моем поиске (как указано выше) я ищу несколько файлов.

Если вы не возражаете против -- вместо </blank line>, добавьте параметр -0 к вашему grep / zgrep команда.Это должно позволить -- появляться даже при поиске нескольких файлов.Вы по-прежнему можете использовать флаги -A и -B по желанию.

1 голос
/ 04 февраля 2014

Я не могу проверить это с параметрами -A и -B, поэтому не могу сказать наверняка, но вы можете попробовать использовать sed G, как упомянуто здесь на Unix StackEx .Вы потеряете цвет, хотя, если это важно.

0 голосов
/ 07 июня 2016

Попробуйте с -c 2;с выводом контекста я вижу, что grep отделяет найденное o / p

0 голосов
/ 26 ноября 2011

Нет варианта для этого в grep, и я не думаю, есть способ сделать это с xargs или tr (я пытался), но вот дляцикл, который сделает это (for f in *; do grep -H "1" $f && echo; done):

[ 11:58 jon@hozbox.com ~/test ]$ for f in *; do grep -H "1" $f && echo; done

a:1

b:1

c:1

d:1

[ 11:58 jon@hozbox.com ~/test ]$ ll
-rw-r--r--  1 jon  people     2B Nov 25 11:58 a
-rw-r--r--  1 jon  people     2B Nov 25 11:58 b
-rw-r--r--  1 jon  people     2B Nov 25 11:58 c
-rw-r--r--  1 jon  people     2B Nov 25 11:58 d

-H - отображать имена файлов для совпадений grep.При необходимости измените * на собственную строку расширения файла / пути к файлу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...