Prepend match number для вывода строк совпадений grep? - PullRequest
1 голос
/ 11 июля 2019

Скажите, у меня есть этот файл, test.log:

blabla test test
20 30 40
hello world
100 100
34 506 795
blabla test2
50 60 70
hello
10 10
200 200
blabla test BB
30 40 50
100 100
20 20 20 20

Я хотел бы напечатать все строки с blabla в них, после строки - с добавленным номером совпадения.

Без номера совпадения это просто:

$ grep -A1 "blabla" test.log
blabla test test
20 30 40
--
blabla test2
50 60 70
--
blabla test BB
30 40 50

С заранее установленным номером совпадения это будет выглядеть так:

1: blabla test test
1: 20 30 40
--
2: blabla test2
2: 50 60 70
--
3: blabla test BB
3: 30 40 50

Сложность в том, что я хочу сохранитьномер совпадения, независимо от того, просто я grep для совпадения на одну строку или с контекстом (X строк после или перед совпадением).

Есть ли простой способ сделать это?Если бы я мог сделать спецификатор формата для числа, как в %03d, даже лучше - но просто обычное число тоже подойдет ...

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Что-то вроде

 grep -A1 blahblah test.log | awk -v n=1 '$0 == "--" { n += 1; print; next }
                                          { printf("%03d: %s\n", n, $0) }'
1 голос
/ 11 июля 2019

Perl на помощь!

perl -ne '/blabla/ and print ++$i, ":$_" and print "$i:", scalar <>' -- file
  • -n читает строку ввода строкой
  • каждая строка считывается в специальную переменную $_
  • оператор ромба <> читает следующую строку из входного файла
  • скаляр заставляет его читать только одну строку, а не все остальные
  • переменная $i увеличивается каждый раз, когда встречается blabla и добавляется к каждой выходной строке.

Ваша спецификация не обрабатывает случай, когда два blabla s присутствуют на соседних строках.

Для форматирования чисел используйте sprintf :

perl -ne 'if (/blabla/) { $f = sprintf "%03d", ++$i; print $f, ":$_"; print "$f:", scalar <>}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...