如何使grep在管道输入的所有内容均不含指定模式时返回0?
解决方法
方法一:反转grep匹配结果的退出码
你需要的逻辑是「所有行都不包含指定模式时返回0」,本质就是当grep找不到任何匹配行时返回0,反之返回非0。直接用!反转grep -q的退出码就能实现:
# 输入包含b,最终返回1 echo -e "a\nb\nc" | ! grep -q b; echo $? # 输入不包含b,最终返回0 echo -e "a\nc\nd" | ! grep -q b; echo $?
原理:grep -q b在找到匹配行时返回0,未找到时返回1;!会反转这个退出码,刚好契合你的需求。
方法二:用-L选项处理管道输入
grep -L的作用是当目标内容中没有匹配模式时,返回0(原本是针对文件输出文件名,处理管道时可指定标准输入为目标)。你可以用-或/dev/stdin指代管道传来的标准输入:
# 输入包含b,无输出,返回1 echo -e "a\nb\nc" | grep -L b -; echo $? # 输入不包含b,输出"-"并返回0 echo -e "a\nc\nd" | grep -L b -; echo $?
如果不需要输出标识内容,加上-q选项即可:
echo -e "a\nc\nd" | grep -qL b -; echo $?
内容的提问来源于stack exchange,提问作者ataraxis
相关产品推荐
相关产品推荐

