本文是慕課網(wǎng) 《實(shí)例妙解sed 和 awk 的秘密》 的學(xué)習(xí)記錄的第一部分:正則表達(dá)式形葬。
Linux 三大利器: grep, sed, awk.
1. 準(zhǔn)備工作
正則表達(dá)式應(yīng)用場(chǎng)景:查找、取出性含、匹配符合條件的字符或字符串
學(xué)習(xí)方法:從小到大位他、組合的過(guò)程晦攒。單個(gè)字符->字符串->表達(dá)式喇肋。
grep 搜索命令匹配正則表達(dá)式例子
$ grep 'root' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_cvmsroot:*:212:212:CVMS Root:/var/empty:/usr/bin/false
2. 正則單個(gè)字符的表示方式
1. 特定字符
某個(gè)具體的字符示弓,如 '1', 'a'
使用 grep 搜索命令進(jìn)行正則表達(dá)式的匹配
$ grep '1' passwd
daemon:*:1:1:System Services:/var/root:/usr/bin/false
_taskgated:*:13:13:Task Gate Daemon:/var/empty:/usr/bin/false
_scsd:*:31:31:Service Configuration Service:/var/empty:/usr/bin/false
_eppc:*:71:71:Apple Events User:/var/empty:/usr/bin/false
...
匹配結(jié)果被標(biāo)紅
2. 范圍內(nèi)字符
- 單個(gè)字符 []
數(shù)字字符:[0-9], [278], 表示2/7/8, 注意只匹配一個(gè)字符损拢。
$ grep '[0-9]' passwd
小寫(xiě)字符:[a-z]
大寫(xiě)字符:[A-Z]
大小寫(xiě):[a-zA-Z]
符號(hào): [,:!%-().]
反向字符: ^, 必須放在范圍之前,[]內(nèi)部被碗,如
$ grep '[^0-9]' passwd
3. 任意字符
代表任何一個(gè)字符: .
注意 ., \., [.] 的區(qū)別某宪,其中后兩個(gè)的作用是一樣的。
4. 其他常用字符
- 邊界字符/頭尾字符
頭字符 ^root, 表示以root開(kāi)頭的行锐朴,注意與取反字符 [^0-9] 的區(qū)別
尾字符 false$, 表示以false結(jié)尾的行兴喂。
$ grep '^root' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
$ grep 'false$' passwd
nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false
daemon:*:1:1:System Services:/var/root:/usr/bin/false
...
空行: ^$, 頭尾相接。
- 元字符(代表普通字符或特殊字符)
實(shí)質(zhì)上起替代的作用
\w: 匹配任何字類(lèi)字符,即字母數(shù)字下劃線 [a-zA-Z0-9_]
\W: 匹配任何非字類(lèi)字符衣迷,即 [^a-zA-Z0-9_]
\b: 代表單詞的分隔
grep '\btime\b' file
只匹配包含單詞 time 的行畏鼓,不匹配 timezone,showtime 等蘑险。
3. 字符組合
1. 字符串
'root', '1000', 'r..t' (r開(kāi)頭滴肿,t結(jié)束岳悟,長(zhǎng)度為4的字符串)
'[A-Z][a-z]' (一個(gè)大寫(xiě)字母加一個(gè)小寫(xiě)字母)
'[0-9][0-9]' (兩個(gè)連續(xù)的數(shù)字佃迄,正則為最大化匹配,所以四位數(shù)也會(huì)匹配贵少,五位數(shù)也會(huì)匹配前四位)
2. 重復(fù)
*: 0-n 次匹配前面的字符或表達(dá)式
+: 1-n 次匹配
?: 0-1 次匹配
// 可能的匹配結(jié)果: s, se, see, seee...
$ grep 'se*' passwd
// 可能的匹配結(jié)果: se, see, seee...
$ grep 'se\+' passwd
// 可能的匹配結(jié)果: s, se, 只有兩種
$ grep 'se\?' passwd
后兩者注意要進(jìn)行轉(zhuǎn)義呵俏。
// 匹配字符串,要加括號(hào) se, sese, sese...
$ grep '\(se\)\+' passwd
注意括號(hào)也要進(jìn)行轉(zhuǎn)義滔灶。
- 重復(fù)特定次數(shù) {n,m}
*: 相當(dāng)于 {0,}
+: 相當(dāng)于 {1,}
?: 相當(dāng)于 {0,1}
// 匹配兩到三位數(shù)字
$ grep '[0-9]\{2,3\}' passwd
注意大括號(hào)也要轉(zhuǎn)義普碎。
- 任意字符串: .*
(即任意單字符重復(fù)0-n次)
如: ^r.*, r.*t
$ grep '^r.*' passwd
root:*:0:0:System Administrator:/var/root:/bin/sh
注意:正則貪婪匹配的規(guī)則。
$ grep '\bd.*e\b' passwd
多么貪婪录平,我只想要匹配類(lèi)似 dislike 這種詞麻车。
這時(shí)候就不能重復(fù)任意字符了。
$ grep '\bd[a-z]*e\b' passwd
這樣改就好了斗这。
盡量去縮小要匹配的范圍动猬,才能避免踩這些坑。
3. 邏輯
- 邏輯或 |
$ grep 'bin/\(false\|true\)' passwd
4. 正則案例
1. 匹配4-10位QQ號(hào)
$ grep '^[0-9]\{4,10\}$' file
2. 匹配15或18位身份證號(hào)表箭,包括X
分析:
- 第一位不能為0
- 最后一位的范圍要擴(kuò)大
- 中間為13或16位重復(fù)數(shù)字
// 先寫(xiě)邏輯赁咙,最后加頭尾和轉(zhuǎn)義
$ grep '^[1-9]\([0-9]\{13\}\|[0-9]\{16\}\)[0-9xX]$' file
3. 匹配密碼
分析:
- 密碼保護(hù)字母數(shù)字下劃線,使用元字符 \w
- 可1次或多次重復(fù) +
$ grep '^\w\+$' file