如何统计日志文件中标签出现次数并过滤0次匹配结果?
仅保留含特定标签且计数≥1的日志文件统计结果
问题原因
你之前用grep -v :0报错,是因为没有正确通过管道传递前序命令的输出,grep误将:0当作要处理的文件名,而非过滤条件。
三种可行解决方案
方案1:管道结合grep过滤(最直接)
调整命令,将find执行grep的输出通过管道传给第二个grep,排除结尾为:0的行:
find . /opt/FIXLOGS/l51prdsrv\* -iname "TRADX_*oe*.log" -type f -exec grep -F "103=16" -c {} /dev/null \; | grep -v ':0$'
-F表示按固定字符串匹配103=16,避免正则表达式解析':0$'精准匹配行尾的:0,确保只排除计数为0的结果
方案2:用awk灵活筛选计数
如果需要对计数做更复杂的判断(比如≥N),用awk更合适:
find . /opt/FIXLOGS/l51prdsrv\* -iname "TRADX_*oe*.log" -type f -exec grep -F "103=16" -c {} /dev/null \; | awk -F: '$2 > 0'
-F:以冒号为分隔符,将每行拆分为文件名和计数两列$2 > 0只保留计数大于0的行
方案3:先筛选有匹配的文件再统计(效率更高)
先通过grep -l找出包含目标标签的文件,再统计这些文件的出现次数,避免处理无匹配的文件:
find . /opt/FIXLOGS/l51prdsrv\* -iname "TRADX_*oe*.log" -type f -exec grep -F "103=16" -l {} \; | xargs grep -F "103=16" -c /dev/null
-l让grep仅输出存在匹配的文件名xargs将筛选后的文件名批量传给后续grep做计数,自然不会出现0次结果
内容的提问来源于stack exchange,提问作者Rickon
相关产品推荐
相关产品推荐

