grep、egrep命令及正則表達式
grep系:
grep:Global search Regular Expression and Print out the line。
利用正則表達式進行全局搜索並將匹配到的行顯示出來;
格式:
grep [OPTIONS] PATTERN [FILE...]
grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]
PATTERN:過濾匹配條件,是由沒有特殊意義的文本字符或者是正則表達式元字符構成;
grep: 僅支持基本正則表達式元字符
egrep:可以支持擴展正則表達式元字符
fgrep:不支持任何形式的正則表達式元字符,將所有的字符都視為沒有特殊意義的普通文本字符;
其中正則表達式與擴展正則表達式主要區別在於,正則表達式有的需要將反斜線寫出來,而擴展正則表達式則不需要。
正則表達式的元字符:
基本的正則表達式元字符:BRE
字符匹配類:
".":匹配任意的單個字符;
[root@localhost ~]# grep "a.b" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配a和b中間跟上任意字符的行,結果分別為abc,以及acb)
"[]":匹配任意指定範圍內的單個字符;
[root@localhost ~]# grep "[a]" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配只有a的行)
[^]:匹配任意指定範圍以外的單個字符;
[root@localhost ~]# grep "[^abc]" a.txt ddddddddddddddddddk ccccccccccccccccccl
(匹配除了字母abc以外的字符存在的行,結果是d,k以及l)
下列所有的字符集都可以放置於[]之中,用於匹配字符集範圍內的單個字符;
1、[:lower:]:所有的小寫字母
[root@localhost ~]# grep "[[:lower:]]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有小寫字母存在的行)
2、[:upper:]:所有的大寫字母
[root@localhost ~]# grep "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大寫字母存在的行)
3、[:alpha:]:所有字母,大小寫字母;
[root@localhost ~]# grep "[[:alpha:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有大小字母存在的行)
4、[:digit:]:所有單個的十進制數字;
[root@localhost ~]# grep "[[:digit:]]" a.txt ccccccccccccccc2222
(匹配單個十進制數字存在的行)
5、[:alnum:]:所有的字母和十進制數字;
[root@localhost ~]# grep "[[:alnum:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有的字母和十進制數字)
6、[:punct:]:所有的符號
[root@localhost ~]# grep "[[:punct:]]" a.txt $######@@@#$$$##@@# &*(^())(_(&%!@#$$^*
(匹配所有符號存在的行)
7、[:space:]:表示空白字符,包括空格和制表符;
[root@localhost ~]# grep "[[:space:]]" a.txt |wc -l 3
(匹配空白字符存在的行,在此文件中有三行)
8、[a-z]:只表示所有的小寫字母;
[root@localhost ~]# grep "[a-z]" a.txt aaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有小寫字母存在的行)
9、[A-Z]:只表示所有的大寫字母;
[root@localhost ~]# grep "[A-Z]" a.txt DDDDDDDDDDDDDCCCCC AAACACABCAAABCAAAAA
(匹配所有大寫字母存在的行)
10、[0-9]:僅表示所有的十進制數碼;
[root@localhost ~]# grep "[0-9]" a.txt ccccccccccccccc2222
(匹配所有小寫字母存在的行)
次數匹配類:該類字符前面的一個字符可以出現的次數;
1、*:其前面的字符可以出現任意次,即:0次,1次或多次;
[root@localhost ~]# grep "AAA*" a.txt AAACACABCAAABCAAAAA
(匹配有AAA的行)
2、\?:其前面的字符可有可無,即:0次或1次;
[root@localhost ~]# echo /etc/passwd | grep -o "[^/]*/\?$" passwd
(輸出某個路徑的基名)
3、\{m,n\}:其前面的字符至少出現m次,最多不超過n次;
[root@localhost ~]# grep "A\{2,5\}" a.txt AAACACABCAAABCAAAAA
(匹配打A的行中,A至少出現2次,不能超過5次)
4、\{m\}:其前面的字符必須出現m次;
[root@localhost ~]# grep "A\{5\}" a.txt AAACACABCAAABCAAAAA
(匹配打的A在本行中必須出現5次,匹配結果是最後的AAAAA)
5、\{m,\}:其前面的字符至少出現m次;
[root@localhost ~]# grep "A\{1,\}" a.txt AAACACABCAAABCAAAAA
(匹配到的A至少出現1次,即結果中的A全部匹配到)
6、\{,n\}:其前面的字符至少出現0次,最多不超過n次;
[root@localhost ~]# grep "a\{,1\}" b.txt aabaaabacccvv ababababababa cccccccccccca
(匹配到的a至少出現0次,最多不超過1
次)
7、註意:在正則表達式中,表示任意長度的任意字符:".*"
[root@localhost ~]# grep "^[[:space:]].*" /etc/grub2.cfg
(找出/etc/grub2.cfg以空白字符開頭的非空白行;)
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
[root@localhost ~]# grep "^[[:space:]]*$" /etc/grub2.cfg | wc -l 17
空白行數
字錨定
字首錨定:\<或\b
字尾錨定:\>或\b
[root@localhost ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"
找出一位數或者兩位數
分組與前向引用字符:
\(\):將()中包含的內容作為一個不可分割的整體來處理;
\1,\2,\3...:前向引用字符,
是正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中所闊擴選的內容;\2表示前面所出現的第二組小括號中擴選的內容;...
\(string1\(string2\)\): \1表示string1,\2表示string2
\(string1\).*\(string2\): \1表示string1,\2表示string2
[root@localhost ~]# grep "^\(root\).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash
或者:
\|:將其左右的字符或字符串當做整體來對待;
"C\|cat" C cat
[root@localhost ~]# ifconfig | grep "\<[0-9]\>\|\<[1-9][0-9]\>"
(找出ifconfig中一位數或者兩位數)
擴展的正則表達式元字符:ERE
字符匹配類:
1、".":匹配任意的單個字符;
[root@localhost ~]# egrep "a.b" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配a和b中間跟上任意字符的行,結果分別為abc,以及acb)
2、 "[]":匹配任意指定範圍內的單個字符;
[root@localhost ~]# egrep "[a]" a.txt aaaaaabbbabcabccccc abcabcabcbcacbaaaaa
(匹配只有a的行)
3、[^]:匹配任意指定範圍以外的單個字符;
[root@localhost ~]# egrep "[^abc]" a.txt ddddddddddddddddddk ccccccccccccccccccl
(匹配除了字母abc以外的字符存在的行,結果是d,k以及l)
下列所有的字符集都可以放置於[]之中,用於匹配字符集範圍內的單個字符;
1、[:lower:]:所有的小寫字母
[root@localhost ~]# egrep "[[:lower:]]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有小寫字母存在的行)
2、[:upper:]:所有的大寫字母
[root@localhost ~]# egrep "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大寫字母存在的行)
3、[:alpha:]:所有字母,大小寫字母;
[root@localhost ~]# egrep "[[:alpha:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb
(匹配所有大小字母存在的行)
4、[:digit:]:所有單個的十進制數字;
[root@localhost ~]# egrep "[[:digit:]]" a.txt ccccccccccccccc2222
(匹配單個十進制數字存在的行)
5、[:alnum:]:所有的字母和十進制數字;
[root@localhost ~]# egrep "[[:alnum:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有的字母和十進制數字)
6、[:punct:]:所有的符號
[root@localhost ~]# egrep "[[:punct:]]" a.txt $######@@@#$$$##@@# &*(^())(_(&%!@#$$^*
(匹配所有符號存在的行)
7、[:space:]:表示空白字符,包括空格和制表符;
[root@localhost ~]# egrep "[[:space:]]" a.txt |wc -l 3
(匹配空白字符存在的行,在此文件中有三行)
8、[a-z]:只表示所有的小寫字母;
[root@localhost ~]# egrep "[a-z]" a.txt aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(匹配所有小寫字母存在的行)
9、[A-Z]:只表示所有的大寫字母;
[root@localhost ~]# egrep "[A-Z]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAA
(匹配所有大寫字母存在的行)
10、[0-9]:僅表示所有的十進制數碼;
[root@localhost ~]# egrep "[0-9]" a.txt ccccccccccccccc2222
(匹配所有小寫字母存在的行)
次數匹配類:該類字符前面的一個字符可以出現的次數;
1、*:其前面的字符可以出現任意次,即:0次,1次或多次;
[root@localhost ~]# egrep "AAA*" a.txt AAACACABCAAABCAAAAA
(匹配有AAA的行)
2、?:其前面的字符可有可無,即:0次或1次;
[root@localhost ~]# echo /etc/passwd | egrep -o "[^/]*/?$" passwd
(輸出某個路徑的基名)
3、{m,n}:其前面的字符至少出現m次,最多不超過n次;
[root@localhost ~]# egrep "A{2,5}" a.txt AAACACABCAAABCAAAAA
(匹配打A的行中,A至少出現2次,不能超過5次)
4、{m}:其前面的字符必須出現m次;
[root@localhost ~]# egrep "A{5}" a.txt AAACACABCAAABCAAAAA
(匹配打的A在本行中必須出現5次,匹配結果是最後的AAAAA)
5、{m,}:其前面的字符至少出現m次;
[root@localhost ~]# egrep "A{1,}" a.txt AAACACABCAAABCAAAAA
(匹配到的A至少出現1次,即結果中的A全部匹配到)
6、{,n}:其前面的字符至少出現0次,最多不超過n次;
[root@localhost ~]# egrep "a{,1}" b.txt aabaaabacccvv ababababababa cccccccccccca
(匹配到的a至少出現0次,最多不超過1
次)
7、註意:在正則表達式中,表示任意長度的任意字符:".*"
[root@localhost ~]# grep "^[[:space:]].*" /etc/grub2.cfg
(找出/etc/grub2.cfg以空白字符開頭的非空白行;)
位置錨定字符:
行錨定:
行首錨定:^
行尾錨定:$
[root@localhost ~]# egrep "^[[:space:]]*$" /etc/grub2.cfg | wc -l 17
(匹配/etc/grub2.cfg空白行數)
字錨定
字首錨定:\<或\b
字尾錨定:\>或\b
[root@localhost ~]# ifconfig | egrep "\<[0-9]\>|\<[1-9][0-9]\>"
(找出ifconfig一位數或者兩位數)
分組與前向引用字符:
():將()中包含的內容作為一個不可分割的整體來處理;
\1,\2,\3...:前向引用字符,
是正則表達式處理引擎的內置變量,\1表示前面所出現的第一組小括號中所闊擴選的內容;\2表示前面所出現的第二組小括號中擴選的內容;...
[root@localhost ~]# grep "^(root).*\1" /etc/passwd root:x:0:0:root:/root:/bin/bash
或者:
|:將其左右的字符或字符串當做整體來對待;
"C|cat" C cat
[root@localhost ~]# ifconfig | grep "\<[0-9]\>|\<[1-9][0-9]\>"
(找出ifconfig中一位數或者兩位數)
grep系中常用命令:
1、-A num:同時顯示被PATTERN匹配到的行及其後續num行;
[root@localhost ~]# grep -A 2 "^root" /etc/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
2、-B num:同時顯示被PATTERN匹配到的行及其前面num行;
[root@localhost ~]# grep -B 2 "^xwl" /etc/passwd postfix:x:89:89::/var/spool/postfix:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin xwl:x:1000:1000:XWL:/home/xwl:/bin/bash
3、-C num:同時顯示被PATTERN匹配到的行及其前後num行;
[root@localhost ~]# grep -C 2 "^sshd" /etc/passwd gdm:x:42:42::/var/lib/gdm:/sbin/nologin gnome-initial-setup:x:988:983::/run/gnome-initial-setup/:/sbin/nologin sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin postfix:x:89:89::/var/spool/postfix:/sbin/nologin
4、--color[=WHEN]:以高亮顏色表示被匹配到的內容;
[root@localhost ~]# grep --color=auto ‘^sshd‘ /etc/passwd sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
(sshd為加上顏色的)
5、-c,--count:不輸出被PATTERN匹配的行的內容,而是輸出被PATTERN匹配到的行數;
[root@localhost ~]# grep -c "^[[:space:]]*$" /etc/grub2.cfg 17
6、-E:可以使GREP命令支持擴展正則表達式元字符;相當於egrep命令;
[root@localhost ~]# ifconfig | grep -E "\<[0-9]\>|\<[1-9][0-9]\>"
7、-F:--fixed-string:相當於fgrep;
8、-e PATTERN, --regexp=PATTERN:指定多個模式PATTERN在一個命令行中生效;
[root@localhost ~]# grep -e "AAA*" -e "aaa*" a.txt AAACACABCAAABCAAAAC aaaaaaaaaaaaaaaaaaa
9、-f FILE, --file=FILE:從指定的文件中讀取多個PATTERN用於一次搜索;
[root@localhost ~]# cat a.txt | grep -f b.sh $######@@@#$$$##@@# &*(^())(_(&%!@#$$^*
(從其中找出相同的字符進行匹配)
10、-i, --ignore-case:忽略文件中的字符的大小寫;
[root@localhost ~]# grep -i "[[:upper:]]" a.txt DDDDDDDDDDDDDCCCCCC AAACACABCAAABCAAAAC aaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbb ccccccccccccccc2222
(-i忽略大小寫,本來是匹配大寫字母,最後連小寫字母也一起匹配上)
11、-o, --only-matching:僅顯示被PATTERN匹配到的部分;關閉了貪婪模式;
(取得字符串很有用)
[root@localhost ~]# echo /etc/passwd | grep -o "[^/]*/\?$" [root@localhost ~]# passwd
(取出/etc/passwd路徑中的基名)
12、-q, --quiet, --silent:安靜模式;沒有輸出結果;相當於grep > /dev/null
13、-v, --invert-match:顯示沒有被PATTERN匹配到的行;
[root@localhost ~]# grep -v "^[[:space:]]*$" /etc/grub2.cfg | wc -l 123
grep、egrep命令及正則表達式