【问题标题】:Windows Grep: How do I Search for a file that contains 3 different wordsWindows Grep:如何搜索包含 3 个不同单词的文件
【发布时间】:2014-01-29 23:52:43
【问题描述】:

这一定是个愚蠢的问题,但我找不到答案。我正在使用 Windows Grep。

我想找到包含 String1 AND string2 AND St​​ring3 的文件

谢谢!

编辑

我尝试了来自 answer 的正则表达式,但 windows grep 显示错误..

(?=match this expression)(?=match this too)(?=oh, and this)

编辑 2:

感谢@brianadams 和@MC ND 的回答!我会检查一下 awk,因为它似乎是 windows grep 的一个很好的替代品。由于问题是关于 windows grep 我认为最好的方法是让它打开以检查是否有人知道答案..

再次非常感谢您的回答!

【问题讨论】:

  • 我已经有一段时间没有使用 grep 了,我的方法可能是做 3 个单独的 grep,然后得到结果的交集。
  • 听起来不错!唯一的问题是,首先,结果上有几十个文件,其次,更重要的是,我太懒了.. :D 现在,说真的,这是我将来必须做的很多事情,它会是以编程方式完成它很酷!感谢您的回答,如果没有人给出更好的答案,我会使用它。谢谢!
  • 也许这会对你有所帮助(向下滚动到 AND):thegeekstuff.com/2011/10/grep-or-and-not-operators
  • 我刚试过,但不起作用..这不仅适用于linux吗?
  • 它看起来像,我认为它可能适用于 windows grep。值得一试

标签: windows grep


【解决方案1】:

here下载windows awk

然后这样做

C:\> awk "/string1/&&/string2/&&/string3/{print}" myFile.txt

优于grepfindstr

编辑 如果您想在文件中的任何位置查找所有 3 个字符串,请将 RS="\0" 传递给 awk。这将要求 awk 读取整个文件

C:\> awk "BEGIN{RS=\"\0\"}/string1/&&/string2/&&/string3/{print FILENAME;exit}" myFile.txt

【讨论】:

  • 从操作问题来看,三个子字符串可以出现在文件中的任何位置,不需要在同一行。也许我错了,但这种模式只匹配同一记录上的三个字符串。
  • @MCND,管道到 3 findstr 也将无法找到它们。如果 OP 想在文件中的任何位置找到这 3 个模式,则可以将 && 更改为 ||
  • 不,findstr 不会失败。第一个 findstr 搜索第一个字符串并返回匹配的文件列表(/m 开关,没有行匹配,只有文件名)。第二个 findstr 在从标准输入检索的文件列表中的文件上搜索第二个字符串,从第一个 findstr(/f:/ 开关)通过管道传输,将匹配文件列表发送到管道中的下一个 findstr,并重复该过程第三个字符串。在您的 awk 代码中,更改为 || 并不能确保三个字符串在文件中,只能确保文件中至少有一个
  • 是的,但是如果像你说的那样,模式在不同的行上,那么第一个 findstr 只会找到第一个模式。不是这样吗?
  • 是的,但是 findstr 没有通过管道发送匹配的行。只有文件名。因此,第二个 findstr 检索文件列表(包含 string1 的文件),在其中搜索 string2。然后,发送找到的文件列表(包含 string1 和 string2)执行第三个 findstr 以搜索第三个字符串。关键是管道中没有数据行,只有文件名,并且每个 findstr 只在前一个 findstr 指示的文件集上搜索它的字符串。
【解决方案2】:

通常,对于复杂的搜索条件,我建议使用grep,但在这种情况下,在整个文件中搜索字符串时,findstr 可能是更好的选择(或者不适合,请参阅undocumented behaviour and limitations of findstr

无论如何,假设您的文件不与findstr 限制冲突,其特征之一是它能够从控制台/管道中检索应在其中搜索字符串的文件列表。因此,在您的情况下,您将需要类似

findstr /l /c:"string1" /m files*.* | findstr /l /c:"string2" /m /f:/ | findstr /l /c:"string3" /m /f:/

其中/l 表示搜索是文字字符串,/c:"string" 是要搜索的字符串,/m 只返回文件列表,/f:/ 从标准输入中检索要搜索的文件列表。

这样,每个findstr 只在管道中从前一个findstr 返回的文件列表中搜索。

【讨论】:

  • 这很难看。管道到这么多的过程。 grepfindstr 好得多
  • @brianadams,我同意,grep 要好得多,但在这种情况下,无需安装任何额外的东西,findstr 可以在没有临时文件的情况下完成这项工作,而这些临时文件应该需要用 grep 来解决它。
  • 为什么需要使用grep 创建临时文件? grepfindstr 的作用基本相同。
  • @brianadams,是的,但是 grep 不接受要从标准输入处理的文件列表,因此,要解决它,有必要生成临时文件,每个子字符串搜索的结果为稍后处理并确定包含三个子字符串的文件的最终列表
  • 只需将上面的findstr 替换为grepgrep 能够接收 glob 和标准输入。
猜你喜欢
  • 2012-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-11
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
相关资源
最近更新 更多