当将 find 导入 grep 时,如何保留 grep 的匹配突出显示?

当将 find 导入 grep 时,如何保留 grep 的匹配突出显示?

如果我运行grep foo bar.txt,grep 会突出显示 中出现的每个“foo” bar.txt。但有时我想使用find来确定 grep 搜索哪些文件。所以我做了这样的事情:

find . -iname "*.abc" | xargs grep foo

或这个:

find . -iname "*.abc" -exec grep foo {} \;

在这两种情况下,grep 都正确地在指定的文件中找到了“foo”的出现,但输出没有任何突出显示。

我怎样才能继续使用find来选择 grep 进行搜索的文件而不丢失突出显示?

我在 Ubuntu 12.04 上运行 Gnome Terminal 3.4.1.1,使用 bash 作为我的 shell。

答案1

在这两个命令中,问题在于不是grep由另一个命令生成实际输出(分别是xargsfind)。

您可以通过直接调用grep每个文件名来解决这个问题:

IFS=$'\n'
for FILE in $(find . -iname "*.abc"); do
    grep foo $FILE
done
unset IFS

或者用一行代码来表达:

IFS=$'\n';for FILE in $(find . -iname "*.abc");do grep foo $FILE;done;unset IFS

怎么运行的:

  • IFS=$'\n'将内部字段分隔符设置为换行符(否则文件名中的空格会导致问题)。

  • for FILE in $(COMMAND); do COMMANDS done循环遍历指定的文件COMMAND,将变量设置FILE为当前文件并执行COMMANDS

  • grep foo $FILE搜索并foo发送$FILE结果直接地到屏幕上。

  • unset IFS将内部字段分隔符设置回其默认值(脚本中不需要)。

答案2

只需grep再次输出即可为其着色。

我在这里做了类似的事情:从 grep 获取匹配的附加数据

相关内容