如何实现多grep通用输出,及双条件匹配并输出目标文件内容?
嘿,我来给你详细说两种场景的解决办法,用grep就能轻松搞定~
场景1:仅输出同时包含两个字符串的文件名
如果你的需求是找出所有同时包含字符串A和字符串B的文件,只输出文件名的话,可以这么做:
基础写法(适用于当前目录下的文件,比如所有txt文件)
grep -l "字符串A" *.txt | xargs grep -l "字符串B"
解释一下:
- 第一个
grep -l "字符串A" *.txt会找出当前目录下所有包含字符串A的txt文件,只输出文件名 - 通过管道
|把这些文件名传给xargs,再用第二个grep -l筛选出其中包含字符串B的文件,最终输出的就是同时满足两个条件的文件名
递归查找子目录的写法
如果需要遍历当前目录及所有子目录,加上-r参数即可:
grep -rl "字符串A" . | xargs grep -l "字符串B"
处理文件名带空格的情况
如果你的文件名里有空格,上面的写法可能会出错,这时候可以用-z和-0参数来适配:
grep -rlz "字符串A" . | xargs -0 grep -l "字符串B"
场景2:输出同时包含两个字符串的文件的全部内容
如果需要把符合条件的文件的全部内容都输出出来,有两种常用方法:
方法1:用循环+静默判断
for file in *.txt; do # -q是静默模式,只返回匹配状态,不输出内容 if grep -q "字符串A" "$file" && grep -q "字符串B" "$file"; then cat "$file" fi done
这种写法的好处是逻辑清晰,而且能很好处理带空格的文件名。
方法2:先找文件名再输出内容
也可以先按场景1的方法找出符合条件的文件名,再用cat输出内容:
grep -l "字符串A" *.txt | xargs grep -l "字符串B" | xargs cat
同样,处理带空格的文件名时,改成:
grep -rlz "字符串A" . | xargs -0 grep -l "字符串B" | xargs -0 cat
额外小技巧
如果需要忽略大小写匹配,可以给grep加上-i参数;如果要使用正则表达式匹配字符串,加上-E参数即可。
内容的提问来源于stack exchange,提问作者Aniket Gupta
相关产品推荐
相关产品推荐

