【问题标题】:bash use output of find with grepbash 使用 grep 的 find 输出
【发布时间】:2017-06-15 18:43:31
【问题描述】:

我正在尝试在包含大量文件的目录中的未知文件中 grep 模式。我通常会执行以下代码:

$ grep 0RY7HYLA in ./*8017*/*diag*

但是,因为我在一个非常大的文件文件夹中搜索文件,所以我不能直接使用 grep,因为该操作占用了太多带宽。我需要将 find 命令与 grep 结合使用。我正在努力将 find 命令的输出作为 grep 命令的输入,即

find ./*8017*/*diag* -maxdepth 3 -type f -name output_log -exec egrep -l '0RY7HYLA' {} \;  | grep 0RY7HYLA

上述代码不起作用,即运行此代码没有输出。如果我只在管道之前执行代码,它会输出文件和目录,但是使用 grep 没有输出。

其次,我需要把它放在一个条件语句中,比如:

if find ./*8017*/*diag* -maxdepth 3 -type f -name output_log -exec egrep -l '0RY7HYLA' {} \; ; then grep 0RY7HYLA ???????? ; fi

这可行吗?

【问题讨论】:

  • 你想要的输出是什么?您是否尝试打印匹配两个字符串的行?
  • "上面的代码不起作用。" -> 是什么让你这么说?是否返回了意外的结果,或者没有返回预期的结果,或者显示错误?
  • 我刚刚对该声明添加了更好的解释。
  • grep -l 在匹配时输出文件名,这可能被第二个 grep 过滤掉了。你可能不想在这里使用管道,这就是为什么我问你想要的输出是什么。向我们展示一个minimal reproducible example,其中包含一个包含几行的文件和相应的输出。
  • 所需的输出是匹配文件(来自查找)中与搜索模式(grep 模式)匹配的行

标签: bash grep find pipe match


【解决方案1】:

如果我理解正确,我认为您尝试做的事情可以通过以下命令解决:

find . -type f -print0 | xargs -0 grep "0RY7HYLA"

这将打印当前目录下文件中出现的“0RY7HYLA”。

【讨论】:

  • 为什么不直接使用-exec grep '0RY7HYLA' {} + 而不是使用xargs
  • 我会查一下,我不知道 -exec 标志和 {} +。感谢您的预约!
【解决方案2】:

我必须使用 bash 在一个充满日志的文件夹中定位字符串,我以以下方式执行此操作:

grep --color -r -i "string" \root\...\mostparentfoldertolookin\*

如果您需要查找多个字符串,我会使用以下语法:

egrep --color -r -i "string1|string2|string3" \root\...\mostparentfoldertolookin\*

以下语法产生的结果:

\root\...\mostparentfoldertolookin\folderfileisin\file.log:<line the string is found on highlighting the string it's self>

如果您要查找的只是包含字符串的文件,您可以将输出带到“:”,如下所示:

grep --color -r -i "string" \root\...\mostparentfoldertolookin\* | sed 's/:.*//'

如果您需要任何进一步的帮助,请发表评论,谢谢。

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多