shell之正则表达式与grep的使用
1、正则表达式
概念及作用
- 正则表达式是重要的文本处理工具。
- 对文本处理的:vim,sed,对文本进行过滤和截取的awk,以及grep都会用到正则。
- 正则表达式regular expression,RE,是一种字符模式,用于在查找过程中匹配的指定的字符。
- 在大多数的程序里,正则表达式都被置于两个正斜线之间,eg:/[oO]ve/就是由正斜杠界定的正则表达式 ,它将匹配被查找的行中任何位置出现的相同模式。
- 在正则表达式中,元字符是最重要的概念。
正则表达式基本元字符
元字符 | 功能 |
---|---|
^ | 行首定位符 |
$ | 行尾定位符 |
. | 匹配单个字符 |
* | 匹配前导符0到多次 |
.* | 任意多个字符 |
[] | 匹配指定范围内的一个字符 |
[ - ] | 匹配指定范围内的一个字符 |
[^] | 匹配不在指定组内的字符 |
\ | 用来转义元字符 |
\< | 词首定位符 |
\> | 词尾定位符 |
\(..\) | 匹配稍后使用的字符的标签 |
x\{m\} | 字符x重复出现m次 |
x\{m,\} | 字符x重复出现m次以上 |
x\{m,n\} | 字符x重复出现m到n次 |
eg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47[root@centos7 shell]# cat 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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@centos7 shell]# grep '^\<root\>' passwd # grep匹配以root开头的单词的行
root:x:0:0:root:/root:/bin/bash
[root@centos7 shell]# grep '^[^rc]' passwd # grep匹配不以r或c开头的单词的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@centos7 shell]# grep 'o\{2\}' passwd # grep匹配第一个表示o出现2次的行
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
[root@centos7 shell]# grep 'o\{1,\}' passwd # grep匹配o出现1次以上的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
正则表达式扩展元字符
egrep支持扩展元字符,grep不支持扩展元字符。
元字符 功能 + 匹配一个或多个前导字符 ? 匹配零个或一个前导字符 a|b 匹配a或b () 组字符 (..)(..)\1\2 标签匹配字符 x{m} 字符x重复m次 x{m,} 字符x重复至少m次 x{m,n} 字符x重复m到n次 eg1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35[root@centos7 shell]# cat 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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@centos7 shell]# egrep 'ro+t' passwd # egrep匹配r与t间有1个或多个o字符的行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@centos7 shell]# ss -an |egrep ":80|22\\>" # egrep匹配有以:80或22结尾的单词的行
u_str LISTEN 0 100 private/rewrite 46122 * 0
u_str ESTAB 0 0 @/tmp/dbus-dJrLd2zIjf 49222 * 49220
u_str ESTAB 0 0 * 49220 * 49222
u_str ESTAB 0 0 /run/dbus/system_bus_socket 49123 * 49122
u_str ESTAB 0 0 * 49122 * 49123
u_str ESTAB 0 0 * 45221 * 45222
u_str ESTAB 0 0 /run/dbus/system_bus_socket 45222 * 45221
u_dgr UNCONN 0 0 * 22821 * 22822
u_str ESTAB 0 0 * 49322 * 49324
u_dgr UNCONN 0 0 * 22822 * 22821
u_str ESTAB 0 0 /run/systemd/journal/stdout 49324 * 49322
udp UNCONN 0 0 192.168.122.1:53 *:*
tcp LISTEN 0 5 192.168.122.1:53 *:*
tcp LISTEN 0 128 *:22 *:*
tcp ESTAB 0 96 192.168.142.133:22 192.168.142.1:60644
tcp LISTEN 0 128 :::22 :::*
2、Grep使用实战
grep家族:
- grep:在文件中全局查找指定的正则表达式,并打印所有包含该表达式的行。
- egrep:扩展的egrep,支持更多的正则表达式元字符。
- fgrep:固定grep(fixed grep),,有时候也被称之为快速fast grep,它按字面解释所有的字符。
grep和egrep使用的元字符:
grep:使用基本元字符集^,$,.,*,[],[^],\< \>,\(\),\{\}
egrep(或grep -E):使用扩展元字符集?,+,{},|,()。
grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线。
eg1:grep程序的输入可以来自标准输入或者管道,而不仅仅是文件。
1
2
3
4[root@centos7 shell]# ps aux |grep sshd
root 7750 0.0 0.2 112756 4304 ? Ss 10:30 0:00 /usr/sbin/sshd -D
root 8473 0.0 0.2 160848 5644 ? Ss 10:31 0:00 sshd: root@pts/0
root 8988 0.0 0.0 112728 984 pts/0 S+ 11:07 0:00 grep --color=auto sshdeg2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23egrep 'NW' datafile # 找有NW的行
egrep 'NW' d* # 找以d开始的所有文件中有NW的行
egrep '^n' datafile # 找以n开始的行
egrep '4$' datafile # 找以4结尾的行
egrep 'TB Savage' datafile # 找有TB Savage的行
egrep '5\..' datafile # 找(5.任意一个字符)
egrep '\.5' datafile # 找有.5的行
egrep '^[we]' datafile # 找w或者e开头的行
egrep '[^0-9]' datafile # 找非数字行
egrep '[A-Z][A-Z] [A-Z]' datafile # 找大写字母大写字母空格大写字母的行
egrep 'ss*' datafile # 找至少有一个s的行,或者egrep 's+' datafile
egrep '[a-z]{9}' datafile # 找连续出现9个相同英文字母
egrep '\<north' datafile # 找有以north作为词首的行
egrep '\<north\>' datafile # 找有north单词的行
egrep '\<[a-r].*n\>' datafile # 找有a-r开头,n结尾的单词的行
egrep '\bnorth\b' datafile # 找有north单词的行
egrep 'NW|EA' datafile # 找有NW或EA的行
egrep '3+' datafile # 找1到多个3的行
egrep '2\.?[0-9]' datafile # 找2零到1个点,接着数字的行
egrep '(no)+' datafile # 找no出现1到n次的行
egrep 'S(h|u)' datafile # 找有Sh或Su的行
egrep 'Sh|u' datafile # 找有Sh或u的行
grep选项。
选项 功能 -i,–ignore-case 忽略大小写 -l,–files-with-matches 只列出匹配行所在的文件名 -n,–line-number 在每一行前面加上它在文件中的相对行号 -c,–count 显示成功匹配的行数 -s,–no-messages 禁止显示文件不存在或文件不可读的错误信息 -q,–quiet,–silent 静默 -v,–invert-match 反向查找,只显示不匹配的行 -R,-r,–recursive 递归针对目录 –color 颜色 -o,–only-matching 只显示匹配的内容 -B,–before-context=NUM print NUM lines of leading context,显示匹配行和它前面的n行 -A,–after-context=NUM print NUM lines of trailing context,显示匹配后和它后面的n行 -C,–context=NUM print NUM lines of output context,显示匹配行和它前后各n行 eg:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39[root@centos7 ~]# grep --help |grep '\-v' # 查看grep中-v的选项信息
-v, --invert-match select non-matching lines
-V, --version display version information and exit
[root@centos7 ~]# grep '^IPA' /etc/sysconfig/network-scripts/ifcfg-ens33 |egrep -o '([0-9]{1,3}\.){3}[0-9]{1,3}' # 查看本机ip地址
[root@centos7 shell]# cat 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
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
dbus:x:81:81:System message bus:/:/sbin/nologin
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
[root@centos7 shell]# grep -B2 '2:daemon' passwd # 显示有2:daemon所在行和它前面的两行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@centos7 shell]# grep -A2 '2:daemon' passwd # 显示有2:daemon所在行和它后面的两行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@centos7 shell]# grep -C2 '2:daemon' passwd # 显示有2:daemon所在行和它前后的两行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
[root@centos7 shell]# grep -n 'root' passwd # 找到有root的行并显示行号
1:root:x:0:0:root:/root:/bin/bash
6:operator:x:11:0:operator:/root:/sbin/nologin