使用find(1)和grep(1)查找包含特定字符串的文件


70

find . -type f -print -exec cat {} \; | grep some string

上面的命令不会显示文件路径。

我正在使用:Ubuntu, bash 4


可能是因为grep筛选器无法满足您的预期结果。那怎么办:find . -type f -fprint /dev/stderr -exec cat {} \; | grep some string
artistoex

您要实现的目标是什么?在输出中,您正在从文件中获取grepped字符串,您想要这些文件的路径吗?
mirkobrankovic

是的,我想打印包含字符串“ some string”的文件的路径。@artistoex建议打印所有文件路径。
H.Rabiee

您可能只是想使用ackgrep浏览当前目录下的所有文件,可能仅过滤某些文件类型。
Jaap Eldering,2015年

Answers:


87

那是因为您要提供grep的文本流恰好包含文件名。由于您没有提供文件名作为grep的参数,因此不能期望得出匹配行来自哪个文件。用途xargs

find . -type f -print | xargs grep "some string"

由于您具有GNU find / xargs,因此这是xargs读取文件名的更安全方法:

find . -type f -print0 | xargs -0 grep "some string"

如果只希望文件名具有匹配行而不显示匹配行:

find . -type f -print0 | xargs -0 grep -l "some string"

如何将上述命令与搜索和替换结合起来?如在,grep然后sed?
CMCDragonkai 2015年

1
find | grep管道输出文件名,因此:sed '...' $(find ... | xargs grep -l ...)
glenn jackman

107

我用

grep "some string" . -R

而且它工作更快

ps

更复杂的用例

grep -HiRE "some string|other string" . #H for file printing, i for case-insensitive, R for recursive search, E for regex 

阅读参数我的解释

grep --help | grep -- -i

17
-n如果你想行号。+1简化答案。
乍得·斯基特斯2013年

完全是@ChadSkeeters。使用查找不会给出这样的解决方案。
ArcherGodson

1
老实说,这应该被标记为正确答案。当前选择的一个完全详细介绍了其他内容。

11

我经常在复杂的文件夹结构中搜索源代码,并且发现使用以下命令很有用:

cd /your/folder/
grep -rHino "your string"

使用这些参数,无需使用find即可获取文件的完整路径和包含指定string行号

这也很容易记住,因为它像rHino一样通过搜索BASH:)

我将通过一个简单的示例来说明这是如何工作的。

让我们使用cat显示文件的内容:

jeeves ~ # cat fw.stop
#!/bin/sh
echo "Stopping firewall and allowing everyone..."
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

让我们递归搜索所有包含字符串“ iptables -P”的文件:

jeeves ~ # grep -rinHo "iptables -P"
fw.stop:9:iptables -P
fw.stop:10:iptables -P
fw.stop:11:iptables -P

如您在输出中看到的,我们有filename:hit row:searched字符串

这是所用参数的更详细说明:

-r对于每个目录操作数,以递归方式读取和处理该目录中的所有文件。在命令行上遵循符号链接,但是跳过递归遇到的符号链接。请注意,如果未提供文件操作数,则grep将搜索工作目录。这与“ --directories = recurse”选项相同。

-i打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。

-n在输出的每一行之前在其输入文件中添加基于1的行号。(-n由POSIX指定。)

-H打印每个匹配项的文件名。当要搜索多个文件时,这是默认设置。

-o仅打印匹配行的匹配(非空)部分,每个这样的部分在单独的输出行上。输出行使用与输入相同的定界符,如果还使用了-z(--null-data),则定界符为空字节(请参阅其他选项)。


1

我更喜欢

| |找到文件|使grep继续查找文件| 显示文件的完整路径

查找/ -type f -exec grep'一些字符串'{} \; -exec echo {} \;


0

Silver Searcher是一种非常便捷的工具,用于搜索文件和内容。

为了解决您的问题,silver searcher命令将如下所示:

ag 'some string' -l

-l 仅打印包含匹配项的文件名(不打印匹配行)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.