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

时间:2013-02-15 21:39:41

标签: shell scripting grep

列出所有不包含2个不同字符串的文件

我有一个 dir ,其中有多个文件以模式命名,例如 file1.txt

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

grep -l "String" file*

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

grep -l "string1|string2" file*

2 个答案:

答案 0 :(得分:4)

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

使用egrep:

egrep -L "string1|string2" file*

答案 1 :(得分: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*