什么是正则?
正则就是一串有规律的字符串
掌握好正则对于编写 shell 脚本有很大帮助
各种编程语言中都有正则,原理都是一样的
我们要学习的有 grep/egrep、sed、awk
grep 工具的使用
之前也多次用到过 grep 命令,可见它的重要性。该命令的格式为:grep[-cinvABC] 'word' filename
选项 | 含义 |
---|---|
-c | 显示行数,表示打印符合要求的行数 |
-i | 表示忽略大小写 |
-n | 显示行号,表示输出符合要求的行及其行号 |
-v | 取反,表示打印不符合要求的行 |
-r | 遍历所有子目录 |
-A | 后面跟一个数字(有无空格都可以),例如-A2 表示打印符合要求的行及下面两行 |
-B | 后面跟一个数字,例如-B2表示打印符合要求的行及上面两行 |
-C | 后面跟一个数字,例如-C2表示打印符合要求的行及上下各两行 |
准备
[root@evan-01 ~]# mkdir grep
[root@evan-01 ~]# cp /etc/passwd grep/
[root@evan-01 ~]# cd grep/
[root@evan-01 grep]# ls
passwd
[root@evan-01 grep]# pwd
/root/grep
[root@evan-01 grep]#
grep 不加选项
[root@evan-01 grep]# grep 'nologin' passwd
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
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:997:User for polkitd:/:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
user3:x:1006:1005::/home/user3:/sbin/nologin
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@evan-01 grep]#
grep -c 显示行数,显示符合要求的行数
[root@evan-01 grep]# grep -c 'nologin' passwd
19
[root@evan-01 grep]#
grep -n 显示行号,显示符合要求的行及行号
[root@evan-01 grep]# grep -n 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
24:user3:x:1006:1005::/home/user3:/sbin/nologin
26:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
27:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
28:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@evan-01 grep]#
grep -i 不区分大小写
先编辑下文件,把 nologin 改成大写一个
[root@evan-01 grep]# vi passwd
按 i 切换编辑模式,把第二行的 nologin 改为 NOLogin
按 esc ,输入 :wq 保存退出
直接查看,发现带大写 NOLogin 的第二行没有出现
[root@evan-01 grep]# grep -n 'nologin' passwd
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
24:user3:x:1006:1005::/home/user3:/sbin/nologin
26:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
27:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
28:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@evan-01 grep]#
加上 -i 选项再看,有了
[root@evan-01 grep]# grep -ni 'nologin' passwd
2:bin:x:1:1:bin:/bin:/sbin/NOLogin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11:games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13:nobody:x:99:99:Nobody:/:/sbin/nologin
14:systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15:dbus:x:81:81:System message bus:/:/sbin/nologin
16:polkitd:x:999:997:User for polkitd:/:/sbin/nologin
17:postfix:x:89:89::/var/spool/postfix:/sbin/nologin
18:sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
19:chrony:x:998:996::/var/lib/chrony:/sbin/nologin
24:user3:x:1006:1005::/home/user3:/sbin/nologin
26:rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
27:rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
28:nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin
[root@evan-01 grep]#
grep -v 取反,打印不符合要求的行
会把不带 nologin 的行都展示出来
[root@evan-01 grep]# grep -vni 'nologin' passwd
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/sync
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8:halt:x:7:0:halt:/sbin:/sbin/halt
20:evan1:x:1000:1000::/home/evan1:/bin/bash
21:evan2:x:1001:1001::/home/evan2:/bin/bash
22:user1:x:1002:1002::/home/user1:/bin/bash
23:user2:x:1004:1005::/home/user2:/bin/bash
25:user4:x:1007:1007::/home/user4:/bin/bash
[root@evan-01 grep]#
grep -r 遍历所有子目录
[root@evan-01 grep]# grep -r 'root' /etc
不加 -r
[root@evan-01 grep]# grep 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@evan-01 grep]#
-A2 打印符合要求的行及下面两行
[root@evan-01 grep]# grep -nA2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/NOLogin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@evan-01 grep]#
-B2 打印符合要求的行及上面两行
[root@evan-01 grep]# grep -nB2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
[root@evan-01 grep]#
-C2 打印符合要求的行及上下两行
[root@evan-01 grep]# grep -nC2 'root' passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/NOLogin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin
--
8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@evan-01 grep]#