如何使用egrep查找包含string的文件

我想在linux下find包含特定string的文件。 我尝试了一些但不能成功的东西:

找 。 -name * .txt | egrep mystring

Solutions Collecting From Web of "如何使用egrep查找包含string的文件"

在这里,您将发送文件名称( find command输出)作为egrep的输入; 你实际上想要运行egrep文件的内容。

这里有几个选择:

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

甚至更好

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

检查find命令帮助检查单个参数是做什么的。
第一种方法将为每个文件产生一个新的进程,而第二种方法将传递多个文件作为egrep的参数; 需要使用-print0和-0标志来处理潜在的恶意文件名(例如,即使文件名包含空格,也允许正确分隔文件名)。

尝试:

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

你的版本有两个问题:

首先*.txt将首先被shell展开,给你一个当前目录下以.txt结尾的文件列表,例如,如果你有以下内容:

 [dsm@localhost:~]$ ls *.txt test.txt [dsm@localhost:~]$ 

你的find命令会变成find . -name test.txt find . -name test.txt 。 试试以下来说明:

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

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

 find . -name *.txt | egrep mystring 

这是行不通的,因为egrep会在find . -name *.txt产生的输出内搜索mystring find . -name *.txt find . -name *.txt ,它们只是*.txt文件的路径。

相反,你可以使用xargs

 find . -name *.txt | xargs egrep mystring 

你可以使用

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

下面是一个例子,它将返回一个以ERROR开头的行的all *.log文件的文件路径:

 find . -name "*.log" -exec egrep -l '^ERROR' {} \; 

有一个egrep可以使用的递归选项

 egrep -R "pattern" *.log 

如果你只想要文件名:

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

如果你想要文件名和匹配:

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