shell 使用grep统计大量日志文件中出现的所有标记

z0qdvdin  于 2023-02-09  发布在  Shell
关注(0)|答案(4)|浏览(157)

我需要获取标记的数量,例如在许多文件中找到的"103 = 16",它们有多少,但仅限于出现一次或多次的文件
我正在使用:

find . /opt/FIXLOGS/l51prdsrv\* -iname "TRADX\_*oe*.log" -type f -exec grep -F 103=16 -c {} /dev/null ;

它查找标记所在的文件并显示匹配的数量,但也显示0个匹配项
退货
file1.log:0
file2.log:0
file3.log:6
file4.log:0
使用a-i排除0或grep-v:0对我不起作用,得到的结果是:
grep::0:没有此类文件或目录
如何仅获取计数大于0的文件?

yrdbyhpb

yrdbyhpb1#

您是否尝试过在find/exec之后通过管道连接到grep来否定那些带零的值?
例如,下面这个对我很有效:

find . -type f -iname "TRADX_oe.log" -exec grep -cFH "103=16" {} \; | grep -v ":0"
js81xvg6

js81xvg62#

使用awk在一个位置执行所有操作

find . -type f -iname "TRADX_oe.log" -exec awk '/103=16/{c++} END { if(c)print FILENAME, c}' {} \;
whlutmcx

whlutmcx3#

这就是grep的-c选项的工作方式:

  • c,--count抑制正常输出;相反,打印每个输入文件的匹配行计数。使用-v,--invert-match选项(见下文),计算不匹配的行。
    因此,它将打印0个计数,唯一的选择是使用-v或awk使用另一个grep删除0:
awk '/search_pattern/{f[FILENAME]+=1} END {for(i in f){print i":"f[i]}}' /path/to/files*
a7qyws3x

a7qyws3x4#

当我将grep管道传输到;不包括零|grep -v“:0”
结尾是这样的:
查找. route -输入名称“TRAD_oe.log”-类型f -执行grep -cHF“103=16”{} ;|grep -v“:0”

相关问题