показать имя файла с совпадающим словом только из grep - PullRequest
1 голос
/ 27 мая 2020

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

'BA10\|BA20\|BA21\|BA30\|BA31\|BA00'  

поэтому, если файл dummylogfile.log содержит BA10002, я хотел бы получить такой результат, как :

dummylogfile.log: BA10002

совершенно нормально, если файл журнала отображается дважды для повторяющихся совпадений.

ближайший, который я получил, это:

for f in $(find . -name '*.err' -exec grep -l 'BA10\|BA20\|BA21\|BA30\|BA31\|BA00' {} \+);do printf $f;printf ':';grep -o  'BA10\|BA20\|BA21\|BA30\|BA31\|BA00' $f;done

, но это дает такие вещи, как:

./register-05-14-11-53-59_24154.err:BA10
BA10
./register_mdw_files_2020-05-14-11-54-32_24429.err:BA10
BA10
./process_tables.2020-05-18-11-18-09_11428.err:BA30
./status_load_2020-05-18-11-35-31_9185.err:BA30

итак,
1) есть пустые строки только со вторым совпадением и
2) полное совпадение (например, BA10004) не показано.

спасибо за помощь

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Есть несколько параметров, которые вы можете передать в grep:

  • -H: Это сообщит имя файла и совпадение
  • -o: отображать только совпадение, а не всю строку
  • -w: Совпадение должно представлять собой полное слово (строка строится из [A-Za-z0-9_])

Если мы посмотрим на ваше регулярное выражение, вы используете BA01, это будет соответствовать только BA01, которое может появиться в любом месте текста, также в середине слова. Если вы хотите, чтобы регулярное выражение соответствовало полному слову, оно должно читать BA01[[:alnum:]_]*, что добавляет любую последовательность символов, составляющих слово (эквивалент [A-Za-z0-9_]). Вы можете проверить это с помощью

$ echo "foo BA01234 barBA012" | grep -Ho "BA01"
(standard input):BA01
(standard input):BA01
$ echo "foo BA01234 barBA012" | grep -How "BA01" 
$ echo "foo BA01234 barBA012" | grep -How "BA01[[:alnum:]_]*" 
(standard input):BA01234

Таким образом, ваш grep должен выглядеть как

grep -How "\('BA10\|BA20\|BA21\|BA30\|BA31\|BA00'\)[[:alnum:]_]*" *.err
0 голосов
/ 28 мая 2020

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

grep -l 'BA10\|BA20\|BA21\|BA30\|BA31\|BA00' *.err

Если файлы находятся в разных каталогах:

find . -name '*.err' -print | xargs -I {} grep 'BA10\|BA20\|BA21\|BA30\|BA31\|BA00' {} /dev/null

Пояснение: добавление / dev / null к filename {} заставляет grep сообщать о совпадающем имени файла

...