2017-07-06 112 views
0

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

+2

为什么不使用'find/path/to/search -type f -name“的结果vsim.log” '然后搜索一个或几个文件。它会更快。 –

+0

@ DavidC.Rankin因为我对Linux不是很熟悉,并且我还没有真正意识到可用的功能,因为我仍然在学习。也就是说,目前速度并不是太多的因素,但我一定会读到发现,并且可能学会如你所说的去做。 – dorojevets

+0

我提供了一个例子作为答案。如果您还有其他问题,请告诉我。 –

回答

1

从我的评论继续,您可以使用find来定位文件vsim.log如果你不知道它的确切位置,然后使用-execdir选项findgrep文件,任期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)来搜索你的home目录

  • 选项-type f告诉找只查找文件(见man find的链接处理)

  • 选项-name "foo"告诉找到只名为foo找到文件的所有文件(通配符允许)

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

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

  • +是什么告诉find它已达到(与-exec使用\;)命令

  • 最后的结束时,${match%:*}参数扩展上的变量$match用于解析filename from filename:Elapsed time通过grep -H返回(只是被用来从$match右边修剪一切,第一:%:*

给一个尝试和执行时间比较文件树的递归grep。如果您知道包含所需信息的文件名的某些部分(或文件模式时间或权限集合等),那么您在此讨论中可能会丢失的内容是您使用的是find。它可以在文件树中搜索数百万个文件,比每个文件递归地递归grep快得多。如果你不知道什么文件可能包含所需的信息 - 然后使用grep,只需等待...

+0

这会在我执行的文件中,还是我将整个事件输入终端? – dorojevets

+0

您只需将其输入到您的终端或将其包含在脚本中即可。 Bash非常灵活。您可以在命令行上执行任何操作,您可以放入脚本,反之亦然......如果在脚本中使用,请在第一行包含'#!/ bin/bash',告诉解释器使用'bash'而不是其他一些shell。我更新了'while'循环来吐出包含任何'Elapsed time'匹配文件的完整路径作为例子。 –

+0

我也删除了'tmp',它只是我用来确认行为的目录名称。实际上,你告诉'find'开始搜索,例如'find/path/to/search'(它会递归搜索下面的所有内容)。它可以是*相对*或*绝对*路径。如果你在整个根文件系统上运行'find',那么包括'-mount'选项以防止搜索可能包含很多不是文件的'/ dev','/ proc'和'/ sys'系统目录。 –

相关问题