【问题标题】:How to list all files that do not contain two different strings如何列出不包含两个不同字符串的所有文件
【发布时间】:2013-01-31 23:05:43
【问题描述】:

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

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

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

grep -l "String" file*

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

grep -l "string1|string2" file*

【问题讨论】:

  • 您的意思是使用-L 选项(-l 显示内容do 匹配给定正则表达式的文件)?
  • 如果一个文件只包含两个字符串之一,是否应该打印该文件的名称?另外,如果 string1 包含 "f.o" 并且字符串 "flo" 存在于文件中,是否应视为匹配?
  • 是的,我正在尝试列出不包含任何字符串的文件
  • @EdMorton 不仅应该返回不包含任何字符串的文件
  • @Paul33 好的,我刚刚更新了我的答案。

标签: shell scripting grep


【解决方案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*

【讨论】:

    【解决方案2】:

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

    使用 egrep:

    egrep -L "string1|string2" file*
    

    【讨论】:

    • 或者,只是转义“|”:grep -l "string1\|string2"
    • 不错!我不知道。我在想grep -l -e "string1|string2"
    • @chepner 已经评论说它应该是-L 用于列出包含模式的文件。
    • 谢谢你现在让我。我更新了我的答案以反映它。
    猜你喜欢
    • 1970-01-01
    • 2014-05-25
    • 2023-03-22
    • 1970-01-01
    • 2012-03-07
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多