一、需求描述
/etc目录包含了多个目录及脚本文件,现在需要确定/etc路径下的文件中,哪些文件包含了“logread”字符串。
在使用linux时,我们一般用find命令来进行文件查找。但find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等。无法查找文件内容 ,满足不了上述需求。
此时,我们可以考虑用grep命令来实现该需求。
grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找。
二、需求实现
输入命令:
grep "logread" /etc -nr
即可完成查找
。
[root@localhost ~]grep "logread" /etc -nr
grep: /etc/fstab: No such file or directory
/etc/init.d/fhlog:8:PROG=/sbin/logread
/etc/init.d/fhlog:10:PID_FILE="/var/run/logread.fhlog.pid"
grep: /etc/ppp/resolv.conf: No such file or directory
/etc/rc.d/K89fhlog:8:PROG=/sbin/logread
/etc/rc.d/K89fhlog:10:PID_FILE="/var/run/logread.fhlog.pid"
/etc/rc.d/S21fhlog:8:PROG=/sbin/logread
/etc/rc.d/S21fhlog:10:PID_FILE="/var/run/logread.fhlog.pid"
三
、grep
命令介绍
1.作用
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expr
ession Print,表示全局正则表达式版本,它的使用权限是所有用户。
2.格式
grep [options]
3.主要参数
[options]主要参数:
-c:只输出匹配行的计数。
-I:不区分大 小写(只适用于单字符)。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-n:显示匹配行及 行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\: 忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$: 匹配正则表达式的结束行。
\<:从匹配正则表达 式的行开始。
\>:到匹配正则表达式的行结束。
[ ]:单个字符,如[A]即A符合要求 。
[ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求 。
。:所有的单个字符。
* :有字符,长度可以为0。
4.grep命令使用简单实例
$ grep ‘test’ d*
显示所有以d开头的文件中包含 test的行。
$ grep ‘test’ aa bb cc
显示在aa,bb,cc文件中匹配test的行。
$ grep ‘[a-z]\{5\}’ aa
显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
$ grep ‘w\(es\)t.*\1′ aa
如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着 另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用”\”号进行转义,直接写成’w(es)t.*\1′就可以了。
四、经典应用场景
除非要精确区分大小写,否则请加上-i来忽略大小写
1)结合find命令和管道
你的一个音乐文件夹里有多种格式的文件,而你只想找到艺术家jay的mp3文件,并且不含有任何的混合音轨
[root@localhost ~]#find . -name ".mp3" | grep -i jay | grep -vi "remix"
分析: 1)使用find -name 来列出所有mp3文件,重定向给grep
2) 使用grep -i 来查找包含jay的行
3)使用grep -vi 来查找不包含remix的行
2)-A -B -C
很多时候,我们并关心匹配行而是关心匹配行的上下文。这时候-A -B -C就有用了
-A n 后n行,A记忆为(After)
-B n 前n行,B记忆为(Before)
-C n 前n行,后n行,C记忆为(Center)
举例
[root@localhost ~]# ifconfig | grep -A 2 "Link encap"
eth0 Link encap:Ethernet HWaddr 00:0C:29:F3:38:15
inet addr:192.168.91.129 Bcast:192.168.91.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fef3:3815/64 Scope:Link
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
[root@localhost ~]# ifconfig | grep -C 2 "lo"
Interrupt:67 Base address:0x2024
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
3) 用-c来统计数目
你手头有一个很大的文件,这个文件包含网址,比如www.baidu.com tieba.baidu.com等等。你想要知道有多少个隶属于百度的网址。
root@localhost ~]# grep -c "*baidu.com*" filename
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
"123"
123""123
[email protected]
[email protected] 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -cn ".*baidu.com.*" file.txt
4) -r 递归查找子目录
查找当前目录极其子目录下面包含匹配字符的文件
查找子目录,匹配后输出行号,这里的点表示当前目录
[root@localhost ~]# grep -nr HELLO_HWC_CSND_BLOG* .
[root@localhost ~]# grep -nr baidu .
./file.txt:8:www.baidu.com
./file.txt:9:tieba.baidu.com
./file.txt:11:www.baidu.com/search/index
./test/test.txt:1:http://www.baidu.com
查找子目录,匹配后只输出文件名
[root@localhost ~]# grep -lr HELLO_HWC_CSND_BLOG* .
[root@localhost ~]# grep -lr baidu .
./file.txt
./test/test.txt
5)查找不包含某一个目录
[root@localhost ~]#grep -R --exclude-dir=node_modules 'some pattern' /path/to/search
[root@localhost ~]# ls
anaconda-ks.cfg Desktop file.txt find.result install.log install.log.syslog test
[root@localhost ~]# grep -r baidu .
./file.txt:www.baidu.com
./file.txt:tieba.baidu.com
./file.txt:www.baidu.com/search/index
./test/test.txt:http://www.baidu.com
这时候如果我们不想包含test目录
[root@localhost ~]# grep -R --exclude-dir=text "baidu" .
./file.txt:www.baidu.com
./file.txt:tieba.baidu.com
./file.txt:www.baidu.com/search/index
grep: unrecognized option `--exclude-dir=test'
说明版本过老,更新下就ok
6)查找IP地址
这里用到了-o和-P命令
我们通过man grep查看
-o, --only-matching:
Show only the part of a matching line that matches PATTERN.
-P, --perl-regexp:
Interpret PATTERN as a Perl regular expression.
也就是说-o,只显示匹配行中匹配正则表达式的那部分
-P,作为Perl正则匹配
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
"123"
123""123
[email protected]
[email protected] 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -oP "([0-9]{1,3}\.){3}[0-9]{1,3}" file.txt
192.168.0.1
162.12.0.123
7)查找邮箱
[root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
[root@localhost ~]# cat file.txt
wtmp begins Mon Feb 24 14:26:08 2014
192.168.0.1
162.12.0.123
"123"
123""123
[email protected]
[email protected] 123
www.baidu.com
tieba.baidu.com
www.google.com
www.baidu.com/search/index
[root@localhost ~]# grep -oP "[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+" file.txt
[email protected]
[email protected]
参考文章:http://www.open-open.com/lib/view/open1426417914694.html
1.在某目录下的所有文件中搜索确定的关键词
grep -Fnr class ./ 以上命令的意思是:在当前目录下的所有文件中搜索“class”,并显示文件名、行号和匹配所在行内容
2.在某目录下的所有文件中,按使用正则搜索
grep -Pnr "\d{3}" ./
-P 是 Perl 正则表达式,经过测试,发现此模式支持的正则最完整,支持正则的完整度由大到小为: -P >
Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
grep [options]
3.主要参数
[options]主要参数
grep是Linux命令行下常用于查找过滤文本文件内容的命令。最简单的用法是:
如果想忽略大小写,可以用-i参数:
如果想搜索目录里所有文件,包括子目录的话,并且在结果中显示行号,可以用以下命令:
如果要搜索二进制文件:
grep的语法支持正则表达式,正则表达式有些复杂,以后再讲解。下面是一些有用的参数:
我们可以通过管道操作来让grep变得更强大,管道操作就是把前面一条命令的输出作为后面一条命令的输入,从而把很多简单的命令组合起来完成复杂的功能。例如,如果我们想查找包含apple的行,但又想过滤掉pin
如查找当前目录是下代码中使用syn_bus模块,
find . |xargs grep -r -B 1 -A 6 -n “syn_bus”| grep -v “.svn”../syn_bus.log
查找使用syn_bus的代码的使用情况,写入文件syn_bus.lo...
其中,`-r`参数表示递归查找,`/path/to/search/`为要查找的目录路径。将`要查找的内容`替换为你要查找的具体内容即可。
注意,如果要查找的内容中包含空格或者特殊字符,需要对其进行转义或者加引号。例如:
grep -r "hello world" /path/to/search/
grep -r hello\ world /path/to/search/