仅显示文件名和grep匹配的单词

问题描述 投票:1回答:2

我正在尝试查找日志文件中发生了哪些单词,并显示与以下模式匹配的任何内容的日志文件名:

'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)。

感谢您的帮助

grep find match ksh
2个回答
0
投票

根据您的示例,似乎所有文件都在一个目录中。因此,以下各项立即可用:

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会强制grep报告匹配的文件名


0
投票

您可以通过几个选项传递给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
© www.soinside.com 2019 - 2024. All rights reserved.