2011-05-06 58 views
31

如何使用Grep命令根据通配符file name搜索"LMN2011*"列出所有以此开头的文件?根据文件名模式和文件内容列出文件名 - GREP?

我想添加对这些文件内容的另一个检查。

如果file content有一个像

LMN20113456 

我可以使用GREP一些这方面的东西?

Grep -ls "LMN2011*" "LMN20113456" 

什么是使用shell命令搜索文件名及其内容的正确方法?

回答

51

grep的不使用 “通配符” 搜索 - 这是贝通配,比如* .JPG。 Grep使用“正则表达式”进行模式匹配。而在shell中,'*'的意思是“任何东西”,在grep中,它意味着“匹配前一个项目零次或多次”。

更多信息和例子在这里:http://www.regular-expressions.info/reference.html

要回答你的问题 - 你可以找到文件使用grep匹配某种模式:

find /somedir -type f -print | grep 'LMN2011' # that will show files whose names contain LMN2011 

然后你就可以搜索他们的内容(不区分大小写):

find /somedir -type f -print | grep -i 'LMN2011' | xargs grep -i 'LMN20113456' 

如果路径中可以包含空格,则应该使用“零终点”功能:

find /somedir -type f -print0 | grep -iz 'LMN2011' | xargs -0 grep -i 'LMN20113456' 
+0

如何将结果文件名写入服务器 – zod 2011-05-06 17:29:57

7
grep LMN20113456 LMN2011* 

,或者如果你想通过子目录递归搜索:

find . -type f -name 'LMN2011*' -exec grep LMN20113456 {} \; 
+0

我怎样才能把结果写入文件名到一个文本文件中的服务器 – zod 2011-05-06 17:30:03

+0

使用grep -l列出匹配的文件名而不是匹配的行,然后将输出重定向到文件。 – 2011-05-06 22:46:19

0

find/folder -type f -mtime -90 | grep -E “(.txt | .php | .inc | .root | .gif)”| xargs的ls -l命令> WWWlastActivity.log

23

可以毫不find通过用grep的"--include"选项来完成为好。

grep的手册页说:

--include=GLOB 
Search only files whose base name matches GLOB (using wildcard matching as described under --exclude). 

所以,做一个递归搜索字符串匹配特定模式的文件,它会是这个样子:

grep -r --include=<pattern> <string> <directory> 

例如,在所有Makefiles中递归搜索字符串“mytarget”:

grep -r --include="Makefile" "mytarget" ./ 

或者要在所有文件中搜索start在文件名以“制作”荷兰国际集团:

grep -r --include="Make*" "mytarget" ./ 
+0

中的文本文件中,很高兴知道“如何在没有查找的情况下完成”,实际上,只是为了分享观点 – Victor 2016-04-08 04:25:45

0

假设LMN2011*文件内/home/me/home/me/temp或低于跳过任何东西:

find /home/me -name 'LMN2011*' -not -path "/home/me/temp/*" -print | xargs grep 'LMN20113456'