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