如何使用egrep查找包含特定字符串的文件

8
我想在Linux下查找包含特定字符串的文件。 我尝试了以下命令,但没有成功: ``` find . -name *.txt | egrep mystring ```
7个回答

16

你现在正在发送文件名(即find命令的输出)作为egrep的输入,实际上你想要运行egrep在文件内容上。

以下是几种替代方案:

find . -name "*.txt" -exec egrep mystring {} \;

甚至更好

find . -name "*.txt" -print0 | xargs -0 egrep mystring

查看find命令帮助以了解单个参数的含义。
第一种方法将为每个文件生成一个新进程,而第二种方法将把多个文件作为egrep的参数传递;-print0和-0标志用于处理可能会出现问题的文件名(例如,即使文件名包含空格,也能正确地分离文件名)。


你的第一条命令末尾缺少\+\; - drrlvn
这不是试图在mystring中找到文件名吗?我认为他是在寻找另一种方式。 - Kevin
@spatz:关于 + 的一个方便之处是,对于大多数 shell 来说 + 不是特殊字符(我不知道是否所有的 shell 都是这样,但不愿意说全部),因此您不需要使用反斜杠。 - William Pursell

3

尝试:

find . -name '*.txt' | xargs egrep mystring

你的版本存在两个问题: 首先*.txt 会被 shell 展开,给你列出当前目录中以 .txt 结尾的文件列表。例如,如果你有以下内容:
[dsm@localhost:~]$ ls *.txt
test.txt
[dsm@localhost:~]$ 

你的find命令将变成find . -name test.txt。只需尝试以下示例:

[dsm@localhost:~]$ echo find . -name *.txt
find . -name test.txt
[dsm@localhost:~]$ 

其次,egrep 无法从 STDIN 中获取文件名。为了将它们转换为参数,您需要使用 xargs

我还建议在-name后面的模式中加上引号,以防止shell对其进行模式匹配。 - heijp06
我想感谢你们所有人提供如此全面的答案。 - Tolga

1
find . -name *.txt | egrep mystring

这样做不起作用,因为egrep将在由find . -name *.txt生成的输出中搜索mystring,而这些输出只是指向*.txt文件的路径。

相反,您可以使用xargs

find . -name *.txt | xargs egrep mystring

1

你可以使用

find . -iname *.txt -exec egrep mystring \{\} \;

1
这是一个示例,它将返回所有以ERROR开头的行的*.log文件路径:
find . -name "*.log" -exec egrep -l '^ERROR' {} \;

1

你可以使用egrep的递归选项

egrep -R "pattern" *.log

这样不起作用。-R选项仅递归到目录中,如果它们在参数列表中被提供。在这种情况下,这些目录中的所有文件都将被读取,而不仅仅是以.log结尾的文件。如果您通过此方法获得任何成功,则是因为当前目录中存在以.log结尾的文件,因为 shell 解析了*.log。 - heijp06
也许可以使用 egrep -R "pattern" --include=*.log . 命令? - moala

1

如果你只想要文件名:

find . -type f -name '*.txt' -exec egrep -l pattern {} \;

如果您想要文件名和匹配项:

find . -type f -name '*.txt' -exec egrep pattern {} /dev/null \;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接