我正在尝试查找日志文件中发生了哪些单词,并显示与以下模式匹配的任何内容的日志文件名:
'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 -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报告匹配的文件名
您可以通过几个选项传递给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