在使用linux时,经常需要进行文件查找。其中查找的命令主要有find和grep。两个命令是有区别的。 区别: (1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。 (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。 基本格式: grep "被查找的字符串" 文件名 1.主要参数 [options]主要参数: -c:只输出匹配行的计数。 -i:不区分大小写 -h:查询多文件时不显示文件名。 -l:查询多文件时只输出包含匹配字符的文件名。 -n:显示匹配行及行号。 -s:不显示不存在或无匹配文本的错误信息。 -v:显示不包含匹配文本的所有行。 从文件内容查找与正则表达式匹配的行: (不完全支持正则写法) grep '正则表达式' 文件名 或 grep –e '正则表达式' 文件名 或 grep –E '正则表达式' 文件名
# 注意转义符:忽略正则表达式中特殊字符的原有含义 $ grep '\(面积\)' api-2017-05-04.log $ grep -i -e '\(面积\)' api-2017-05-04.log #如果用egrep或grep -E,就不用”\”号进行转义,直接写成 $ grep -i -E '(面积)' api-2017-05-04.log
pattern正则表达式主要参数: \: 忽略正则表达式中特殊字符的原有含义。 ^:匹配正则表达式的开始行。 $: 匹配正则表达式的结束行。 \<:从匹配正则表达 式的行开始。 \>:到匹配正则表达式的行结束。 [ ]:单个字符,如[A]即A符合要求 。 [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。 .:所有的单个字符。 * :有字符,长度可以为0。 【示例】 从文件内容查找与正则表达式匹配的行: $ grep –e “正则表达式” 文件名 查找时不区分大小写: $ grep –i "被查找的字符串" 文件名 查找匹配的行数: $ grep -c "被查找的字符串" 文件名 从文件内容查找不匹配指定字符串的行: $ grep –v "被查找的字符串" 文件名 【实例】 $ grep 'test' d* #显示所有以d开头的文件中包含 test的行 $ grep -n -E '(peter).*(andy)' api-2017-05-05.log #查找指定文件里面某行匹配此规则(每行有“ peter + 任意字符 + andy” 类型的字符串)
$ grep -n -E '(peter).*(andy)' api-2017-05-05.log 12:[2017-05-05 14:20:22] ...quest {"method":"GET","url":"http://xxx/peter","path......om":"andy","_.....lse,"seure":false,"userAgent":"Apache-HttpCli..ormat":"jso..rom":"andy","_r....}} 18:[2017-05-05 14:23:25] ...quest {"method":"GET","url":"http://xxx/peter/......from":"andy","_...id":"365"},"ajax":false,"userAgent":"Apache-HttpClienm":"andy","_id":"365"}}
$ grep 'test' aa bb cc #显示在aa,bb,cc文件中包含test的行
$ grep 'peter' api-2017-04-13.log api-2017-05-04.log
$ grep '[a-z]{5}' aa #显示所有包含每行字符串至少有5个连续小写字符的字符串的行
$ grep -c '[a-z]\{5\}' api-2017-05-04.log 9
$ grep -r magic /usr/src #显示/usr/src目录下的文件(包含子目录)包含magic的行。
# 搜索 logs/ 目录下所有文件(包括 logs/test/ 目录下的文件)包含了 peter 的行(-c 是匹配的行数) $ grep -r -c 'peter' logs/ logs/api-2017-04-07.log:60 logs/api-2017-04-12.log:27 logs/api-2017-05-04.log:9 logs/api-2017-04-14.log:7 logs/api-2017-05-02.log:53 logs/test/api-2017-05-04.log:9 logs/test/api-2017-05-02.log:53 logs/.gitignore:0 logs/api-2017-03-24.log:0 logs/api-2017-03-31.log:0 logs/api-2017-04-13.log:10
$ grep -w pattern files :#只匹配整个单词,而不是字符串的一部分(如匹配'magic',而不是'magical'),
#只匹配 peter 整个单词,而不是字符串的一部分(如匹配'peter',而不是'peterx'), $ grep -w -c 'peter' api-2017-0* api-2017-03-24.log:0 api-2017-03-31.log:0 api-2017-04-07.log:60 api-2017-04-12.log:27 api-2017-04-13.log:10 api-2017-04-14.log:7 api-2017-05-02.log:53 api-2017-05-04.log:9 #只匹配 pete 整个单词,有 peter 的文件不能被匹配,因为未发现 pete 的单词 $ grep -w -c 'pete' api-2017-0* api-2017-03-24.log:0 api-2017-03-31.log:0 api-2017-04-07.log:0 api-2017-04-12.log:0 api-2017-04-13.log:0 api-2017-04-14.log:0 api-2017-05-02.log:0 api-2017-05-04.log:0
【与find一起使用】 从根目录开始查找所有扩展名为.log的文本文件,并找出包含”ERROR”的行 find / -type f -name ".log" | xargs grep "ERROR" 例子:从当前目录开始查找所有扩展名为.in的文本文件,并找出包含”thermcontact”的行 find . -name ".in" | xargs grep "thermcontact"