假设我有几个字符串:str1、str2和str3。
- 如何查找包含所有字符串的行?
- 如何查找可以包含任何一个字符串的行?
- 如何查找包含 str1 和 str2 或 str1 和 str3 的行,但不同时包含 str2 和 str3?
这看起来像是三个问题。将这些表达式组合在一起的最简单方法是使用多个管道符。没有什么可耻的,特别是因为正则表达式(使用egrep)似乎要求您希望无序。
所以,按顺序:
grep str1 | grep str2 | grep str3
egrep '(str1|str2|str3)'
grep str1 | egrep '(str2|str3)'
您可以使用egrep以无序的方式进行“and”形式,但我认为您会发现更容易记住使用管道过滤器的无序“and”,并使用正则表达式进行无序“or”。
由于grep不支持前瞻,因此您无法合理地执行“所有”或“这两个加上任意一个”的情况。建议使用Perl。对于“任意”情况,请使用egrep '(str1|str2|str3)' file
。
执行“所有”情况的不合理方法是:
egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file
例如,您可以构建排列组合。当然,这是一件荒谬的事情。
对于“这个加上那个”的情况,同样适用:
egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file
grep -E --color "string1|string2|string3...."
例如,要查找我们的系统是否使用AMD(svm)或英特尔(vmx)处理器,并且如果它是64位(lm),则lm代表长模式-这意味着64位...。个人而言,我会使用Perl来完成这个任务,而不是试图用grep拼凑出一些东西。
例如,对于第一个:
while (<FILE>)
{
next if ! m/pattern1/;
next if ! m/pattern2/;
next if ! m/pattern3/;
print $_;
}
perl -ne'print if / pat1 / && / pat2 / && / pat3 /'file1 file2 ..
。是否容易理解取决于读者;但无论如何,现在至少可以剪切和粘贴了。 - michael
fgrep
吗? - Jonathan Leffler