Bash unix匹配多个模式返回成功

Bash unix匹配多个模式返回成功,bash,shell,unix,awk,grep,Bash,Shell,Unix,Awk,Grep,有没有一种简单的方法可以搜索一个文件中的多个模式,并仅在找到两个模式时返回成功 例如,如果我有一个文件: itemA itemB itemC itemD 我想打印所有包含“itemA”和“itemD”的txt文件的名称 比如: find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep 'itemA AND itemB' && echo {}" 如果您想对特殊字符格外小心,请将-Z添加到grep,将-0添加到xargs awk '/

有没有一种简单的方法可以搜索一个文件中的多个模式,并仅在找到两个模式时返回成功

例如,如果我有一个文件:

itemA
itemB
itemC
itemD
我想打印所有包含“itemA”和“itemD”的txt文件的名称

比如:

find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep 'itemA AND itemB' && echo {}"
如果您想对特殊字符格外小心,请将
-Z
添加到grep,将
-0
添加到xargs

awk '/ItemA/{f1=1} /ItemB/{f2=1} END{ exit (f1 && f2 ? 0 : 1) }' file

如果您想特别注意特殊字符,请将
-Z
添加到grep,将
-0
添加到xargs。

将伪代码转换为实代码:

awk '/ItemA/{f1=1} /ItemB/{f2=1} END{ exit (f1 && f2 ? 0 : 1) }' file
find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep -q itemA {} && grep -q itemD {} && echo {}"
您可以通过使第二个
grep
打印文件名来稍微缩短此时间:

find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep -q itemA {} && grep -l itemD {}"

将伪代码转换为真实代码:

find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep -q itemA {} && grep -q itemD {} && echo {}"
您可以通过使第二个
grep
打印文件名来稍微缩短此时间:

find . -name "*.txt" | xargs -n 1 -I {} sh -c "grep -q itemA {} && grep -l itemD {}"

+1为简洁起见。OSX用户:使用
--null
而不是
-Z
grep
+1来简化。OSX用户:使用
-null
代替
-Z
grep