Shell三剑客_1.grep
1.grep
?grep:global regular expression print__全局正则表达式输出。
?grep 命令用于查找(过滤)文件里符合条件的字符串。
?grep与正则表达式联系紧密。
■语法
grep -[参数] <文件名>
■常用参数
- -A<n(行数)> : 抽出并显示符合要查询内容的行,并显示该行之后n行的内容。
- -B<n(行数)> : 抽出并显示符合要查询内容的行,并显示该行之前n行的内容。
- -c : 显示符合要查询内容行的行数数。
- -i : 忽略字符大小。
- -n : 抽出并显示符合要查询内容的行,并在结果行前标示出该行的编号。
- -v : 抽出并显示符合要查询内容以外的所有行。
■实例
?grep -A<n(行数)> filename
拷贝/etc/passwd到/home/yubx目录下
[01 yubx]# cp /etc/passwd /home/yubx
用vi/vim命令修改文件,修改后的passwd文件内容如下:
root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin tomcat:x:1000:1000::/home/tomcat:/bin/bash oracle:x:1001:1006::/home/oracle:/bin/bash tomcat0101abcaaaaccc 1dddddddddkkkkkkkkkkkkkkkkkaaaaa 2fffffffffffffffffff 3aaaaaaaaaaaaaa 4hhhhhhhhhhhhhhh 5ggggggggggggggggggg ~ ~
命令执行结果:
[ yubx]# grep -A1 ‘tomcat‘ passwd tomcat:x:1000:1000::/home/tomcat:/bin/bash oracle:x:1001:1006::/home/oracle:/bin/bash tomcat0101abcaaaaccc 1dddddddddkkkkkkkkkkkkkkkkkaaaaa [ yubx]# grep -A3 ‘tomcat‘ passwd tomcat:x:1000:1000::/home/tomcat:/bin/bash oracle:x:1001:1006::/home/oracle:/bin/bash tomcat0101abcaaaaccc 1dddddddddkkkkkkkkkkkkkkkkkaaaaa 2fffffffffffffffffff 3aaaaaaaaaaaaaa [ yubx]# grep -A10 ‘tomcat‘ passwd tomcat:x:1000:1000::/home/tomcat:/bin/bash oracle:x:1001:1006::/home/oracle:/bin/bash tomcat0101abcaaaaccc 1dddddddddkkkkkkkkkkkkkkkkkaaaaa 2fffffffffffffffffff 3aaaaaaaaaaaaaa 4hhhhhhhhhhhhhhh 5ggggggggggggggggggg [01 yubx]#
解析:
从文件内容中我们可以看到,含有”tomcat“字符的行有两行,分别是第13行和第15行。
- -A1的场合,符合搜索内容的行被抽出,并且相对目标行后1行的内容也被抽出来了。
- -A3的场合,符合搜索内容的行被抽出,并且相对目标行后3行的内容也被抽出来了。
- -A10的场合,符合搜索内容的行被抽出,并且相对目标行后10行的内容也被抽出来了。(文件中最多只有5行)
综上,-A<n>的意思就是抽出并显示符合检索内容的目标行,以及该目标行后所有n行的内容。
?grep -B<n(行数)> filename
作用:抽出并显示符合检索内容的目标行,以及该目标行前所有n行的内容。
※:由于-B和-A的作用差不多,这里就不举例了。
?grep -c ‘要查询的字符串‘ filename
作用:只打印匹配的文本行的行数,不显示匹配的内容。
例:基于上面的passwd文件,执行下面命令。
[01 yubx]# grep -c ‘tomcat‘ passwd 2
上面的执行结果的意思是,passwd文件中有两行内容中含有”tomcat“字符串。
?grep -i ‘要查询的字符串‘ filename
作用:只打印匹配的文本行的行数,不显示匹配的内容。
例:基于上面的passwd文件,追加一行如下内容。
... ... 4hhhhhhhhhhhhhhh 5ggggggggggggggggggg TOMCAT123456uuusssaaadd ~
执行下面的命令:
[01 yubx]# grep -i ‘TOMCAT‘ passwd tomcat:x:1000:1000::/home/tomcat:/bin/bash tomcat0101abcaaaaccc TOMCAT123456uuusssaaadd [-ap-01 yubx]# grep -i ‘tomcat‘ passwd tomcat:x:1000:1000::/home/tomcat:/bin/bash tomcat0101abcaaaaccc TOMCAT123456uuusssaaadd [-ap-01 yubx]#
?grep -n ‘要查询的字符串‘ filename
作用:抽出并显示符合要查询内容的行,并在结果行前标示出该行的编号。
例:基于上面的文件,执行下面的代码
[ yubx]# grep -n ‘tomcat‘ passwd
13:tomcat:x:1000:1000::/home/tomcat:/bin/bash
15:tomcat0101abcaaaaccc
[ yubx]#
上面执行结果中的「13、15」是目标行所在文件中的行编号。
?grep -v ‘要查询的字符串‘ filename
作用:抽出并显示符合要查询内容以外的所有行。
例:基于上面的文件,执行下面的代码
[01 yubx]# grep -v ‘tomcat‘ passwd root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin dbus:x:81:81:System message bus:/:/sbin/nologin polkitd:x:999:998:User for polkitd:/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin oracle:x:1001:1006::/home/oracle:/bin/bash 1dddddddddkkkkkkkkkkkkkkkkkaaaaa 2fffffffffffffffffff 3aaaaaaaaaaaaaa 4hhhhhhhhhhhhhhh 5ggggggggggggggggggg TOMCAT123456uuusssaaadd [-ap-01 yubx]#
从上面的执行结果可以看出,含有"tomcat"的那两行没有被打印出来。
■写在最后
这里只举了几个grep常用的,操作字符串的例子。
这只是grep强大功能的冰山一角。
还有很多参数这里并没有介绍。具体的参数以及参数作用可以用 「grep --help」查看。
grep更强大的功能是和正则连用,并且很多参数可以组合使用。
在后续的【linux正则】随笔中,还会陆续讲解grep功能。
以上。