什麼是正則?
正則就是一串有規律的字符串
掌握好正則對於編寫 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]#