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功能。

以上。