2013-02-15 30 views
4

列出所有不包含2个不同的字符串如何列出不包含两个不同的字符串

文件,我有一个DIR在图案如命名大量文件中的所有文件FILE1.TXT

我可以列出所有不包含一个字符串

grep -l "String" file* 

如何列出文件不包含两个字符串我试过的文件?

grep -l "string1|string2" file* 
+0

你的意思是使用'-L'选项('-l'显示文件,其内容* do *匹配给定的正则表达式)? – chepner 2013-02-15 21:45:22

+0

如果一个文件只包含2个字符串中的一个,那么该文件的名称应该被打印或不打印?另外,如果string1包含“f.o”并且文件中存在字符串“flo”,那么应该将它视为匹配还是不匹配? – 2013-02-16 13:30:12

+0

是的,我想列出不包含任何字符串的文件 – Paul33 2013-02-18 16:49:42

回答

4

您需要grep的参数e或使用egrep。

随着egrep的:

egrep -L "string1|string2" file* 
+0

或者,只需转义“|”:'grep -l“string1 \ | string2”' – chepner 2013-02-15 21:44:13

+0

不错!我不知道。我在'grep -l -e'字符串中考虑'string1 | string2'' – fedorqui 2013-02-15 21:46:18

+0

'egrep'使得输入更容易,因为使用'|'作为替代运算符可能比字符文本更常见。 – chepner 2013-02-15 21:48:00

1

假设你只想打印包含所有字符串的文件名,这里是一个将任何数量的字符串的工作,会做一个字符串比较,而不是常规的解决方案表达式比较:

gawk -v RS='\0' -v strings="string1 string2" ' 
BEGIN{ numStrings = split(strings,stringsA) } 
{ 
    matchCnt = 0 
    for (stringNr=1; stringNr<=numStrings; stringNr++) 
     if (index($0,stringsA[stringNr])) 
     matchCnt++ 
} 
matchCnt == numStrings { print FILENAME } 
' file* 

挂上,我只是注意到你要打印的文件不包含2个字符串。这将是:

gawk -v RS='\0' -v strings="string1 string2" ' 
BEGIN{ numStrings = split(strings,stringsA) } 
{ 
    matchCnt = 0 
    for (stringNr=1; stringNr<=numStrings; stringNr++) 
     if (index($0,stringsA[stringNr])) 
     matchCnt++ 
} 
matchCnt == numStrings { matchesAll[FILENAME] } 
END { 
    for (fileNr=1; fileNr < ARGC; fileNr++) { 
     file = ARGV[fileNr] 
     if (! (file in matchesAll)) 
     print file 
    } 
} 
' file* 

要打印不含有字符串的文件的名称是:

gawk -v RS='\0' -v strings="string1 string2" ' 
BEGIN{ numStrings = split(strings,stringsA) } 
{ 
    for (stringNr=1; stringNr<=numStrings; stringNr++) 
     if (index($0,stringsA[stringNr])) 
     matchesOne[FILENAME] 
} 
END { 
    for (fileNr=1; fileNr < ARGC; fileNr++) { 
     file = ARGV[fileNr] 
     if (! (file in matchesOne)) 
     print file 
    } 
} 
' file* 
相关问题