注意正則表達式有些匹配字符與Shell中的通配符符號一樣,但含義卻不同。注意正則表達式有些匹配字符與Shell中的通配符符號一樣,但含義卻不同。
表1-1
編輯工具 |
基本正則表達式 |
擴展正則表達式 |
grep |
√ |
|
egrep |
√ |
√ |
vi |
√ |
|
sed |
√ |
|
awk |
√ |
√ |
1.1 基本正則表達式(Regular Expression)
表1-2列出了基本正則表達式及其對應的含義。
表1-2
字符 |
含義 |
c |
匹配字母c |
. |
匹配任意單個字符 |
* |
匹配前一個字符出現零次或多次 |
.* |
匹配任意字符 |
[] |
匹配集合中的任意單個字符,括號中爲一個集合 |
[x-y] |
匹配連續的字串範圍 |
^ |
匹配字串的開頭 |
$ |
匹配字串的結尾 |
[^] |
匹配否定,對括號中的集合取反 |
\ |
匹配轉義後的字串 |
\{n,m\} |
匹配前一個字符重複n到m次 |
\{n,\} |
匹配前一個字符重複至少n次 |
\{n\} |
匹配前一個字符重複n次 |
\(\) |
將\(與\)之間的內容存儲在“保留空間”,最大存儲9個 |
\n |
通過\1至\9調用保留空間中的內容 |
2. 基本正則表達式案例
提示:由於模版文件的內容在每個系統略有差異,以下案例的輸出結果可能有所不同。 |
- [root@centos6 ~]# cp /etc/passwd /tmp/ #複製模版文件
- 查找包含root的行:
- [root@centos6 ~]# grep root /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
查找:與0:之間包含任意兩個字符的字串,並顯示該行(--color代表以顏色加亮顯示匹配的內容):
- [root@centos6 ~]# grep --color :..0: /tmp/passwd
- 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
- games:x:12:100:games:/usr/games:/sbin/nologin
- avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
查找包含至少一個0的行(第一個0必須出現,第二個0可以出現0次或多次):
- (魚油輸出內容較多案例中僅爲部分輸出)
- [root@centos6 ~]# grep --color 00* /tmp/passwd
- 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
- uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
- operator:x:11:0:operator:/root:/sbin/nologin
- games:x:12:100:games:/usr/games:/sbin/nologin #匹配0出現2次
- gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
- ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
- avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
- avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin
- 查找包含oot或ost的行:
- [root@centos6 ~]# grep --color o[os]t /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- operator:x:11:0:operator:/root:/sbin/nologin
- postfix:x:89:89::/var/spool/postfix:/sbin/nologin
- 查找包含0-9數字的行:
- [root@centos6 ~]# grep –color [0-9] /tmp/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
- 查找包含f-q字母的行:
- [root@centos6 ~]# grep --color [f-q] /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- bin:x:1:1:bin:/bin:/sbin/nologin
- 查找以root開頭的行:
- [root@centos6 ~]# grep --color ^root /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- 查找以bash結尾的行:
- [root@centos6 ~]# grep --color bash$ /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- 查找sbin/後面不跟n的行:
- [root@centos6 ~]# grep --color sbin/[^n] /tmp/passwd
- shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
- halt:x:7:0:halt:/sbin:/sbin/halt
- 查找數字0出現1次2次的行:
- [root@centos6 ~]# grep --color '0\{1,2\}' /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- sync:x:5:0:sync:/sbin:/bin/sync
- 查找包含兩個root的行(注意,grep在使用\(\)過濾時,匹配條件必須使用引號):
- [root@centos6 test]# grep --color "\(root\).*\1" /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- 查找包含root:開頭:root結尾的字串行:
- [root@centos6 test]# grep --color "\(root\)\(:\).*\2\1" /tmp/passwd
- root:x:0:0:root:/root:/bin/bash
- 過濾文件的空白行:
- [root@centos6 test]# grep ^$ /tmp/passwd
- 過濾文件的非空白行:
- [root@centos6 test]# grep -v ^$ /tmp/passwd
1.2 擴展正則表達式(Extended Regular Expression)
1. 表1-3列出了擴展正則表達式及其對應的含義。
表1-3
字符 |
含義 |
{n,m} |
等同於基本正則表達式的\{n,m\} |
+ |
匹配前一個字符出現一次或多次 |
? |
匹配前一個字符出現零次或一次 |
| |
匹配邏輯或者,即匹配|前或後的字串 |
() |
匹配正則集合 |
2.擴展正則表達式案例
由於輸出信息與基本正則表達式類似,這裏僅寫出命令而不再打印輸出信息。
查找數字0出現1次2次的行:
- [root@centos6 ~]# egrep --color '0\{1,2\}' /tmp/passwd
- 查找包含至少一個0的行:
- [root@centos6 ~]# egrep --color ‘0+’ /tmp/passwd
- 查找包含root或者admin的行:
- [root@centos6 ~]# egrep --color ‘(root|admin)’ /tmp/passwd