我有一个基于事件的目录结构。
在这些事件中,我有一种类型的文件,它包含或不包含我需要搜索的模式。我想将积极的结果存储在单独的文件中。
我的第一个方法是:
find . /EVENT*/'filename' | grep 'searchtext' head -2 > error_file
但这似乎不起作用。我被告知不可能以这种方式组合find
,grep
那么我需要怎么做呢?
答案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 -2
find
grep
答案4
我假设您需要通过文本文件 grep 查找特定模式并通过子目录递归。如果您使用 GNU grep,则非常简单:
cd /to/the/top/level
grep -r "PatternToSearch" *
-r
您可以使用-R
或来代替--recursive
如果搜索模式中有空格,则必须使用引号。
GNU grep 有很多选项。只需输入grep --help
,您就会感到惊讶!