5

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

我有一个目录,其中包含许多以模式命名的文件,例如file1.txt

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

grep -l "String" file*

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

grep -l "string1|string2" file*
4

2 回答 2

4

您需要egrep 的参数,或使用 egrep。

使用 egrep:

egrep -L "string1|string2" file*
于 2013-02-15T21:40:47.900 回答
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*
于 2013-02-16T13:16:35.683 回答