使用grep以递归方式在子目录中搜索特定文件名中的特定关键字

时间:2017-07-06 17:28:44

标签: linux grep

我试图在特定日志文件名Elapsed time中查找文本vsim.log。我不熟悉grep,但经过一些谷歌搜索后,我发现grep -r将允许我进行递归搜索,grep -r "Elapsed time"将在我的目录中的所有文件中对该短语进行递归搜索。根据此链接,我可以grep -r "Elapsed time" ./vsim*以递归方式在目录中搜索以vsim开头的文件,并查看这些文件中的Elapsed time。但是,当我尝试这个时,我得到grep: No match.,我知道这是不正确的,因为我知道这些关键字存在于那里的文件。我搞砸了什么?

3 个答案:

答案 0 :(得分:1)

尝试:

grep -r "Elapsed time" * --include vsim.log

或者这个答案Use grep --exclude/--include syntax to not grep through certain files

答案 1 :(得分:1)

继续发表评论,如果您不知道文件的确切位置,可以使用find找到文件vsim.log,然后使用-execdir选项find grep Elapsed time一词的文件,例如

find path -type f -name "vsim.log" -execdir grep -H 'Elapsed time' '{}' +

这将返回文件名以及匹配的文本,如果需要,您可以简单地解析以隔离文件名。您可以通过将find命令的结果输入while read -r循环来处理所有匹配的文件(如果您预期有多个文件),例如

while read -r match; do
    # process "$match" as desired
    echo "Term 'Elapsed time' found in file ${match%:*}"
done < <(find path -type f -name "vsim.log" -execdir grep -H 'Elapsed time' '{}' +)

其中:

  • find是用于在系统中查找文件的瑞士军刀

  • path可以是任何相对绝对搜索路径(例如$HOME/home/dorojevets)进行搜索主目录中的所有文件

  • 选项-type f告诉find只查找文件(请参阅man find进行链接处理)

  • 选项-name "foo"告诉find只查找名为foo的文件(允许使用通配符)

  • -exec-execdir选项允许您对每个文件执行后面的命令(由'{}'表示)

  • grep -H 'Elapsed time' '{}'是对每个文件名执行的命令

  • +告诉find它已到达命令的末尾(\;-exec一起使用)

  • 最后,变量${match%:*}上的$match 参数展开用于解析 filename filename:Elapsed time返回的em> grep -H%:*仅用于将所有内容修剪为:右侧的第一个$match < / p>

尝试一下,将执行时间与文件树的递归grep进行比较。您在本次讨论中可能缺少的是,如果您知道包含该信息的文件名(或文件模式时间或权限集等)的某些部分,则使用find你需要。它可以比文件树中的每个文件递归grep快得多地搜索文件树中的数百万个文件。如果您不知道哪个文件可能包含所需信息 - 那么请使用grep并等待......

答案 2 :(得分:0)

以防万一,如果您使用的是Mac,请执行以下操作:

要在给定文件夹“ / home”下递归搜索* .c文件中的UUID,请使用以下命令:

grep -r "UUID" --include "*.c" /home/

要在当前文件夹下的多个项目的所有main.c文件中递归搜索UUID,请使用以下命令:

grep -r "UUID" --include "main.c" .