macOS下如何用grep查找同时包含所有指定模式的文件?
在macOS中查找同时包含多模式的日志文件
要实现同时匹配所有指定模式的文件筛选,你需要替换原命令的“逻辑或”逻辑为“逻辑与”,推荐用以下几种简洁的方法:
方法1:多轮grep管道筛选(最直观)
通过管道串联多个grep -l命令,每一步只保留包含当前模式的文件,最终得到同时满足所有条件的文件:
grep -l ',"estadoOperacion":"PP"' ~/Company/logs-delete/pf* | xargs grep -l ',"estadoOperacion":"OX"' | xargs grep -l ',"estadoOperacion":"SPAD"'
- 直接用
~/Company/logs-delete/pf*限定只匹配目录下以pf开头的文件,比递归扫描更高效 -l参数只输出匹配到的文件名,作为下一轮grep的输入
方法2:兼容特殊文件名的版本
如果日志文件名包含空格或特殊字符,加上-Z和-0参数避免解析错误:
grep -lZ ',"estadoOperacion":"PP"' ~/Company/logs-delete/pf* | xargs -0 grep -lZ ',"estadoOperacion":"OX"' | xargs -0 grep -l ',"estadoOperacion":"SPAD"'
-Z让grep用null字符分隔输出的文件名xargs -0以null字符作为分隔符解析输入,避免特殊字符导致的文件名拆分错误
为什么原命令是“逻辑或”
原命令中grep -RHl -e 模式1 -e 模式2的-e参数是指定多个可选匹配模式,只要文件包含其中任意一个模式就会被选中,因此是“逻辑或”的逻辑。而管道串联的方式是逐步筛选,只有通过所有grep检查的文件才会被保留,实现了“逻辑与”的需求。
内容的提问来源于stack exchange,提问作者joseluisbz
相关产品推荐
相关产品推荐

