如果我运行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
由另一个命令生成实际输出(分别是xargs
和find
)。
您可以通过直接调用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 获取匹配的附加数据