正則表達式分為:“基本正則表達式 BRE”跟“擴展正則表達式 ERE”
基本正則表達式:
(1)字符匹配
"."任意單個字符
"[]"匹配指定范圍內的單個字符
"[^]"匹配字符以外的單個字符
(2)次數匹配
"*"匹配前面字符的任意次 (.*:組合就相當于glob中的"*"匹配任意字符任意次)
"\?"匹配前面的字符0次或1次;"\+"匹配前面的字符至少1次
"\{m\}"匹配前面的字符"m"次;"\{m,n\}"匹配前面的字符至少"m"次至多"n"次
(3)位置錨定
"^"行首;"$"行尾;("^$":真空行,什么都沒有。 "^[[:space:]]*$"有空白字符的空行。)
"\<"或"\b"詞首;"\>"或"\b"詞尾;
(4)分組
"\(\)"將一個或多個字符捆綁在一起,當一個整體處理;
"\1"后項引用,引用從左向右數第一個分組所匹配到的字符;以此類推"\2"就是第2個分組所匹配到的字符,"\3"就是第三個….
(圖很丑看明白就好,哈哈..)
注意:后項引用是直接使用前一個分組已經匹配出來的字符結果,而次數匹配的是相當于在做1次或多次匹配
擴展正則表達式:
(1)字符匹配
"."任意單個字符
"[]"匹配指定范圍內的單個字符
"[^]"匹配字符以外的單個字符
(2)次數匹配
"*"匹配前面字符的任意次 (.*:組合就相當于glob中的"*"匹配任意字符任意次)
"?"匹配前面的字符0次或1次;"+"匹配前面的字符至少1次
"{m}"匹配前面的字符"m"次;"{m,n}"匹配前面的字符至少"m"次至多"n"次
(3)位置錨定
"^"行首;"$"行尾;("^$":真空行,什么都沒有。 "^[[:space:]]*$"有空白字符的空行。)
"\<"或"\b"詞首;"\>"或"\b"詞尾;
(4)分組
"()"將一個或多個字符捆綁在一起,當一個整體處理;
"\1"后項引用,引用從左向右數第一個分組所匹配到的字符;以此類推"\2"就是第2個分組所匹配到的字符,"\3"就是第三個….
(5)或者 "|" a|b:a或者b
A|asd:A或者asd
(cai)|(CA)I:cai或者CA
大部分跟正則表達式相同,有些只是去掉"\"反斜線逃。
正則表達式默認工作在貪婪模式下。
grep:是一個可以使用正則表達式搜索匹配的文本過濾工具,使用正則表達式可以做到匹配出很多“glob”匹配不出的內容。
grep [OPTIONS] PATTERN [FILE...] grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...] 選項: --color=auto: 對匹配到的文本著色顯示; -v: 顯示不能夠被pattern匹配到的行; -i: 忽略字符大小寫; -o: 僅顯示匹配到的字符串; -q: 靜默模式,不輸出任何信息; -A #:after, 后#行 -B #: before, 前#行 -C #:context, 前后各#行 -E:使用ERE;
grep使用演示:
1、顯示/proc/meminfo文件中以大小s開頭的行;(要求:使用兩種方式)
# grep -i "^s" /proc/meminfo # grep "^[Ss]" /proc/meminfo # grep "^S" /proc/meminfo && grep "^s" /proc/meminfo (感謝“N21-藍”妹子的細心實驗檢查,這個答案是有問題的,各位可以看下有什么問題檢驗一下自己。)
2、顯示/etc/passwd文件中不以/bin/bash結尾的行;
# grep -v "/bin/bash$" /etc/passwd
3、顯示/etc/passwd文件中ID號最大的用戶的用戶名;
# sort -t: -k3 -n /etc/passwd | tail -1 | grep -o "^[[:alnum:]]\+\b" # sort -t: -k3 -n /etc/passwd | tail -1 | grep -o -E "^[[:alnum:]]+\b"
4、如果用戶root存在,顯示其默認的shell程序;
# id root &> /dev/null && grep "^root" /etc/passwd | cut -d: -f7
5、找出/etc/passwd中的兩位或三位數;
# grep "\b[0-9]\{2,3\}\b" /etc/passwd # grep -E "\b[0-9]{2,3}\b" /etc/passwd
6、顯示/etc/rc.d/rc.sysinit文件中,至少以一個空白字符開頭的且后面存非空白字符的行;
# grep "^[[:space:]]\+[^[:space:]]\+" /etc/rc.d/rc.sysinit
7、找出"netstat -tan"命令的結果中以'LISTEN'后跟0、1或多個空白字符結尾的行;
# netstat -tan | grep --color "LISTEN[[:space:]]*"
8、添加用戶bash、testbash、basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;
這題我使用bash腳本 #!/bin/bash id bash &> /dev/mull || useradd bash id testbash &> /dev/null || useradd testbash id basher &> /dev/null || useradd basher id nologin &> /dev/null || useradd -s /sbin/nologin nologin grep --color "^\(\b[[:alnum:]]\+\b\).*\1$" /etc/passwd #grep --color -E "^(\b[[:alnum:]]+\b).*\1$" /etc/passwd
1、顯示當前系統root、centos或user1用戶的默認shell和UID;
# grep -E '^(root|centos|user1)\>' /etc/passwd | cut -d: -f1,3,7
2、找出/etc/rc.d/init.d/functions文件(centos6)中某單詞后面跟一個小括號的行;
# grep -E -o "^[_[:alpha:]]+\(\)" /etc/rc.d/init.d/functions
3、使用echo輸出一絕對路徑,使用egrep取出其基名;
# echo "/mnt/sdc" | grep -E -o "[^/]+/?$" | cut -d"/" -f1
4、找出ifconfig命令結果中1-255之間的數值;
# ifconfig | grep -E --color "\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-4]?"
5、找出ifconfig命令結果中的IP地址;
# ifconfig | grep -E --color "((\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-5]?)\b\.){3}(\b[0-9]{1,2}\b|\b1[0-9]{1,2}\b|2[0-4][0-9]?|\b25[0-5]?\b)"
原創文章,作者:N21_志建,如若轉載,請注明出處:http://www.www58058.com/22226
寫的很好,排版還可以在漂亮一點,加油