如何统计并显示每个含grep匹配内容文件的匹配次数及脚本排错
需求说明
获取并展示所有包含指定匹配字符串的文件,以及每个文件对应的匹配结果计数。
用户实现脚本
for OUTPUT in $(grep -lR "Sample sv15 Processor" ./*) # 列出包含匹配字符串的文件 do grep "Sample sv15 Processor" $OUTPUT | wc -l done
实现方案存在的问题
- 文件名兼容性极差:使用
for 变量 in $(命令输出)的写法,会自动按空格、制表符、换行符拆分命令返回结果,只要文件名包含空白类特殊字符,就会被拆分成多个无效路径,直接导致后续grep报错、统计结果完全错误。 - 存在多余性能开销:逻辑上先执行一次全目录递归grep找出匹配文件,再对每个匹配文件单独启动grep进程二次扫描,所有匹配文件会被重复读取两次,文件数量大时IO开销、进程创建销毁的开销都会被放大,执行效率很低。
- 输出可读性差:最终只打印纯数字的匹配行数,不同时输出对应文件名,结果数量稍多就完全无法区分计数和文件的对应关系。
- 存在特殊字符解析风险:引用变量
$OUTPUT时没有加双引号包裹,除了前面提到的空白字符拆分问题,一旦文件名包含*、?这类shell通配符,还会触发意外的文件名扩展,进一步导致路径解析错误。 - 统计范围不全:递归路径写为
./*时,shell会提前将*展开为当前目录下所有非隐藏的文件、文件夹,名称以.开头的隐藏文件、隐藏目录会被直接漏掉,不会进入grep的扫描范围。
实际上grep本身内置了计数参数,直接执行
grep -cR "Sample sv15 Processor" .就能一步完成需求,自动输出「文件名:匹配计数」格式的结果,完全不需要写循环二次扫描。
内容的提问来源于stack exchange,提问作者Aso'K
相关产品推荐
相关产品推荐

