我可以在一行中使用 find 和 grep 吗?

我可以在一行中使用 find 和 grep 吗?

我有一个基于事件的目录结构。

在这些事件中,我有一种类型的文件,它包含或不包含我需要搜索的模式。我想将积极的结果存储在单独的文件中。

我的第一个方法是:

find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file

但这似乎不起作用。我被告知不可能以这种方式组合findgrep那么我需要怎么做呢?

答案1

这是一个一般模式:

find /directory/containing/files -type f -exec grep -H 'pattern_to_search' {} +

这里首先find将搜索包含必要文件的目录中的所有文件,您也可以使用通配符,例如*.txt仅查找以.txt.在这种情况下,命令将是:

find /directory/containing/files -type f -name "*.txt" -exec grep -H 'pattern_to_search' {} +

-exec grep -H 'pattern_to_search' {} +找到必要的文件后,我们使用(-H将打印找到模式的文件名)在这些文件中搜索所需的模式。在这里,您可以认为{}包含要搜索的文件,并且+需要在末尾使用,-exec以便-exec仅分叉一次,即grep会像命令一样进行搜索grep -H 'pattern_to_search' file_1.txt file_2.txt file_3.txt

答案2

另一种有效的方法是:

 find /directory/containing/files -type f -print0 | xargs -0 grep "test to search"

print0 / 选项 -0 允许文件名字符串包含特殊字符(如空格)的情况。

答案3

还有一种方式,只需一个过程(没有find, -exec, xargs):

grep -r "test to search" /directory/containing/files

好吧,无论如何,使用 GNU grep 。 :)

ETA:由于我被要求显示该grep --include选项,因此这里有一个类似于 heemayl 的示例(“您还可以使用通配符,例如 *.txt 来查找仅以 .txt 结尾的文件”):

grep --include '*.txt*' -r "pattern to search" /directory/containing/files

当我编辑时,是的,这些是替代方案,而不是直接替换:这些命令将通过符号链接读取(常规)文件。 (不过,它们不会通过符号链接目录进行递归;为此,您需要这样做-R。)它们还将读取套接字、命名管道和设备文件(尽管-D skip可以添加到,嗯,跳过这些文件)。并且没有办法获得像这样的选项grep的效果。如果你需要那些 – 使用.如果你不这样做,那么我认为这是一个不错的选择。find-mtime -2findgrep

答案4

我假设您需要通过文本文件 grep 查找特定模式并通过子目录递归。如果您使用 GNU grep,则非常简单:

cd /to/the/top/level    
grep -r "PatternToSearch" *

-r您可以使用-R或来代替--recursive

如果搜索模式中有空格,则必须使用引号。

GNU grep 有很多选项。只需输入grep --help,您就会感到惊讶!

相关内容