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

Shell 如何列出不包含两个不同字符串的所有文件,shell,scripting,grep,Shell,Scripting,Grep,列出不包含2个不同字符串的所有文件 我有一个目录,其中有许多以模式命名的文件,例如file1.txt 我可以列出不包含一个字符串的所有文件 grep -l "String" file* 如何列出不包含我尝试过的两个字符串的文件 grep -l "string1|string2" file* 您需要grep的参数e,或者使用egrep 与白鹭: egrep -L "string1|string2" file* 假设您只想打印包含所有字符串的文件名,下面是一个解决方案,它适用于任意数量的字符串

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

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

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

grep -l "String" file*
如何列出不包含我尝试过的两个字符串的文件

grep -l "string1|string2" file*

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

与白鹭:

egrep -L "string1|string2" file*

假设您只想打印包含所有字符串的文件名,下面是一个解决方案,它适用于任意数量的字符串,并进行字符串比较,而不是正则表达式比较:

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*
gawk-vrs='\0'-v strings=“string1 string2”'
开始{numStrings=split(strings,stringsA)}
{
匹配CNT=0

对于(stringNr=1;stringNr,只需跳过“|”:
grep-l“string1\| string2”
Nice!我不知道。我在
grep-l-e“string1 | string2”中思考
egrep
使键入更容易,因为使用
|
作为替换运算符可能比作为文本更常见。@切普纳已经评论说,对于列出不包含模式的文件,应该是
-L
。谢谢你现在让我这么做。我更新了我的答案以反映它。你想使用
吗>-L
选项(
-L
显示内容与给定正则表达式匹配的文件)?如果文件仅包含两个字符串中的一个,是否打印该文件的名称?如果字符串1包含“f.o”和字符串“flo”存在于某个文件中,是否应将其视为匹配项?是的,我正在尝试列出不包含这两者的文件string@EdMorton不应仅删除两个字符串都不包含的文件returned@Paul33好的,我刚刚更新了我的答案。
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*