正則:是指有規律的字符串,學習正則表達式,就是學習這些規律以字符串的形式表述,對之後的編寫shell腳本有很大的幫助。正則表達式
正則表達式有三個實用的工具,號稱正則三劍客:grep/egrep、sed、awk,在shell腳本編程中很是重要。shell
grep:一種文本搜索工具,使用特定的匹配模式搜索過濾指定的關鍵詞,並默認輸出匹配含有關鍵詞的行。編程
grep -[選項] '模式(關鍵詞)' 文件名bash
-c選項:匹配包含的行數 grep -c 'root' passwdssh
[root@lgs-01 grep]# grep 'root' passwdtest root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@lgs-01 grep]# grep -c 'root' passwdtest 2
-n選項:輸出匹配行,並顯示其在文件內的行號 grep -n 'root' passwd工具
[root@lgs-01 grep]# grep -n 'root' passwdtest 1:root:x:0:0:root:/root:/bin/bash 10:operator:x:11:0:operator:/root:/sbin/nologin
-i選項:不區分大小寫匹配 grep -i 'nologin' passwdpost
[root@lgs-01 grep]# grep 'user' passwdtest [root@lgs-01 grep]# grep -i 'user' passwdtest ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin
-v選項:取反匹配輸出 grep -r 'nologin' passwd學習
[root@lgs-01 grep]# grep -v 'nologin' passwdtest root:x:0:0:root:/root:/bin/bash sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
-r選項:遍歷全部子目錄匹配,針對目錄 grep -r 'root' /etc/code
-A選項:後面跟數字如-A2,匹配改行及其下面的兩行也輸出 grep -A2 'root' passwd字符串
[root@lgs-01 grep]# grep -nA2 'root' passwdtest 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
-B選項:後面跟數字如-B2,匹配改行及其上面的兩行也輸出 grep -B2 'root' passwd
[root@lgs-01 grep]# grep -nB2 'root' passwdtest 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
-C選項:後面跟數字如-C2,匹配改行及其上面的兩行也輸出 grep -C2 'root' passwd
[root@lgs-01 grep]# grep -nC2 'root' passwdtest 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
grep 範例:
grep '[0-9]' passwd :匹配帶數字的行
[root@lgs-01 grep]# grep '[0-9]' passwdtest 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:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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: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 lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
grep -v '[0-9]' passwd :匹配不含數字的行
[root@lgs-01 grep]# grep -v '[0-9]' passwdtest abc:y
grep '^abc' passwd :匹配以abc號開頭的行
[root@lgs-01 grep]# grep '^abc' passwdtest abc:x:1001:1000::/home/abc:/bin/bash abc:0 abc:y
grep -v '^abc' passwd :匹配不以abc號開頭的行
[root@lgs-01 grep]# grep -v '^abc' passwdtest 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:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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: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 lgs:x:1008:1000::/home/lgs:/bin/bash
grep -v '^abc' passwd |grep -v '^[a-zA-Z]' :匹配不以abc開頭,又不以字母開頭的行
[root@lgs-01 grep]# grep -v '^abc' passwdtest |grep -v '^[a-zA-Z]' 12:22:55 587:1 12:21 12:200 1 9 51 59
grep '[^0-9]' passwd :匹配含有非數字的行
[root@lgs-01 grep]# grep '[^0-9]' passwdtest 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:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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: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 lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash
grep '^[^0-9]' passwd :匹配以非數字開頭的行
[root@lgs-01 grep]# grep '^[0-9]' passwdtest 12:22:55 587:1 12:21 12:200 1 9 51 59
^跟在字符後面,表明以該字符開頭;若是在[ ]中括號內,表明取反的意思。
^abc:表示以abc字符串開頭。 ^[abc]:表示以a開頭或者以b開頭或者以c開頭。[ ]號裏表示裏面某單一個字符。
[root@lgs-01 grep]# grep '^abc' passwdtest abc:x:1001:1000::/home/abc:/bin/bash abc:0 abc:y [root@lgs-01 grep]# grep '^[abc]' passwdtest bin:x:1:1:bin:/bin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin chrony:x:998:996::/var/lib/chrony:/sbin/nologin abc:x:1001:1000::/home/abc:/bin/bash abc:0 abc:y
grep裏的通配符號:
*號 表明前面的單個字符有0個或者多個
.號 表明 匹配任意單個字符
grep 'r.o' passwd :匹配含 r.o (.號表明任意單個字符) 三個字符的行
[root@lgs-01 grep]# grep 'r.o' passwdtest root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin [root@lgs-01 grep]# grep 'r..o' passwdtest operator:x:11:0:operator:/root:/sbin/nologin polkitd:x:999:997:User for polkitd:/:/sbin/nologin
grep 'r*o' passwd :匹配含 o 或者 nr (n表明任意多個) o 的行
[root@lgs-01 grep]# grep -n 'r*o' passwdtest 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 4:adm:x:3:4:adm:/var/adm:/sbin/nologin 5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin 7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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 20:lgs:x:1008:1000::/home/lgs:/bin/bash 21:abc:x:1001:1000::/home/abc:/bin/bash
grep '.*' passwd :匹配任意行、包括空行 (貪婪匹配)
[root@lgs-01 grep]# grep '.*' passwdtest 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:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown 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: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 lgs:x:1008:1000::/home/lgs:/bin/bash abc:x:1001:1000::/home/abc:/bin/bash 12:22:55 587:1 12:21 12:200 1 9 51 59 abc:0 abc:y
{ }花括號表明前面的字符連着出現的次數
grep 'o{2}' passwd :匹配 o 必須連着出現2次的行 。{ }要用轉義字符才生效。
[root@lgs-01 grep]# grep 'o\{2\}' passwdtest root:x:0:0:root:/root:/bin/bash 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 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
egrep 'o{2}' passwd :用egrep不用轉義字符 \ 讓{ }生效
[root@lgs-01 grep]# egrep 'o{2}' passwdtest root:x:0:0:root:/root:/bin/bash 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 postfix:x:89:89::/var/spool/postfix:/sbin/nologin
grep 'o+d' passwd :匹配o出現1次或者屢次的行。+號 表明其前面的單字符出現1次或者屢次
[root@lgs-01 grep]# grep 'o\+d' passwdtest nobody:x:99:99:Nobody:/:/sbin/nologin
grep 'o?t' passwd : 匹配 t 或者 ot 的行。?號表明其前面的單字符出現0次或者1次
[root@lgs-01 grep]# grep 'o\?t' passwdtest root:x:0:0:root:/root:/bin/bash shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt operator:x:11:0:operator:/root:/sbin/nologin ftp:x:14:50:FTP User:/var/ftp:/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
egrep 表明 grep -E
egrep 'root|nologin' passwd :匹配含root或者nologin的行。| 表明或者的意思
[root@lgs-01 grep]# grep -E 'root|nologin' passwdtest 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 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
egrep '(99:){2}' passwd :匹配 99:字符串出現2次的行 。( )中括號表明字符串組合
[root@lgs-01 grep]# egrep '(99:){2}' passwdtest nobody:x:99:99:Nobody:/:/sbin/nologin
+號 { }號 ?號 &號 |號 等特使符號,在grep中須要 加 \ 號轉義才能使用,不轉義表示特殊符號自己的字符輸出
而在egrep中就不用轉義。