搜索包含多项条件的文件

搜索包含多项条件的文件

我可以使用以下方法搜索包含特定单词的文件grep

grep -l "word" /path

但是,如果我想搜索同一行包含“单词 1”和“单词 2”的文件怎么办?我可以使用:

mkdir new;for i in * do;grep "word 1" $i > new/$i_new;done

然后使用

grep -l "word 2" /new

但我希望有一个单行命令。使用

egrep -w -R 'word 1|word 2' /path

仅搜索包含“单词 1”或“单词 2”的行。

如果我有“单词 3”、“单词 4”怎么办?

答案1

使用管道逐行过滤,直到得到你想要的结果:
grep word1 /path | grep word2 | grep word3 | grep word4

答案2

如果每行有 N 个单词,会发生什么情况?那么您必须使用 N 个管道grep命令?

grep word1 /path | grep word2 | grep word3 | grep word4 | grep word5 | ... | grep wordN

如果包含多个单词,则这里仅使用一行grep并匹配:

grep -E 'word1.*word2.*word3.*word4.*' /path

上述命令使用 grep-E选项模拟 AND。如果行中的单词顺序相同,此命令将起作用;如果行如下所示,此命令将失败:

word4 and word3 and word2 and word1

那么按任意顺序进行/查找匹配的新想法是什么?

这个想法是使用带有-P(Perl-Compatibility)选项的 grep 和前瞻正则表达式(?=(regex))

grep -P '(?=.*?word1)(?=.*?word2)(?=.*?word4)(?=.*?word3)' /path
  • 表示.*?匹配所有.重复零次或多次的*可选字符。 表示匹配?其前面的所有内容(表示匹配的所有内容出现零次或一次.*

相关内容