正则表达式的简单认识
文本搜索工具,根據用戶指定的"模式(pattern)"對目標文本進行過濾,顯示被模式匹配到的行。
一、什么是正則表達式?
正則表達式:由一類字符書寫的模式,其中有些字符不表示字符的字面意義,而是表示控制或通配的功能;
二、正則表達式元字符
正則表達式語言由兩種基本字符類型組成:原義(正常)文本字符和元字符。元字符使正則表達式具有處理能力。元字符既可以是放在 [] 中的任意單個字符(如 [a] 表示匹配單個小寫字符 a ),也可以是字符序列(如 [a-d] 表示匹配 a 、 b 、 c 、 d 之間的任意一個字符,而 \w 表示任意英文字母和數字及下劃線),下面是一些常見的元字符:??
.?? ?匹配除 \n 以外的任意單字符(注意元字符是小數點)。?
?
[abcde]??匹配 abcde 之中的任意一個字符?
?
[a-h]? ?匹配 a 到 h 之間的任意一個字符?
?
[^fgh]??不與 fgh 之中的任意一個字符匹配?
?
\w??匹配大小寫英文字符及數字 0 到 9 之間的任意一個及下劃線,相當于 [a-zA-Z0-9_]?
?
\W??不匹配大小寫英文字符及數字 0 到 9 之間的任意一個,相當于 [^a-zA-Z0-9_]?
?
\s??匹配任何空白字符,相當于 [ \f\n\r\t\v]?
?
\S??匹配任何非空白字符,相當于 [^\s]?
?
\d 匹配任何 0 到 9 之間的單個數字,相當于 [0-9]?
?
\D??不匹配任何 0 到 9 之間的單個數字,相當于 [^0-9]?
?
[\u4e00-\u9fa5]??匹配任意單個漢字(這里用的是 Unicode 編碼表示漢字的 )?
三、正則表達式的分類
1、grep及基本正則表達式
grep [OPTION]... 'PATTERN' FILE...
????????
字符匹配:
????????????. : 匹配任意單個字符
????????????[]: 匹配指定集合中的任意單個字符
????????????????[[:digit:]]===[0-9]
????????????????[[:lower:]]===[a-z]
????????????????[[:upper:]]===[A-Z]
????????????????[[:alpha:]]===[a-zA-Z]
????????????????[[:alnum:]]==[0-9a-zA-Z]
????????????????[[:space:]]
????????????????[[:punct:]]
????????????[^]: 匹配指定集合外的任意單個字符
????????匹配次數:用于對其前面緊鄰的字符所能夠出現的次數作出限定
????????????*: 匹配其前面的字符任意次,0,1或多次;
????????????????例如:grep 'x*y'
????????????????????xy, xxy, xxxy, y
????????????\?:匹配其前面的字符0次或1次;
????????????????例如:grep 'x\?y'
????????????????????xy, xxy, y, xxxxxy, aby
????????????\+: 匹配其前面的字符出現至少1次;
????????????\{m\}: 匹配其前面的字符m次;
????????????????例如:grep 'x\{2\}y'
????????????????????xy, xxy, y, xxxxxy, aby
????????????\{m,n\} 匹配其前面的字符至少m次,至多n次;
????????????????例如: grep 'x\{2,4\}y'
????????????????????????xy, xxy, y, xxxxxxy, aby
???????????????????? grep 'x\{0,4\}y'
???????????????????? ????xy, xxy, y, xxxxxxxxxy, aby
???????????????????? grep 'x\{2,\}y'
???????????????????? ????xy, xxy, y, xxxxxy
????????????.*: 匹配任意長度的任意字符
????????位置錨定:
????????????^: 行首錨定
????????????????寫在模式的最左側
????????????$: 行尾錨定
????????????????寫在模式的最右側
????????????^$: 空白行
?
????????????\<: 詞首錨定, 相當于\b
????????????????出現在要查找的單詞模式的左側;\<char
????????????\>:詞尾錨定, 相當于\b
????????????????出現在要查找的單詞模式的右側;char\>
????????????\<pattern\>: 匹配單詞
????????分組:
????????????\(\)
????????????后向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容后面的模式中可以被引用;
????????????????\1, \2, \3
????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;
來個習題來形象的解釋后向引用
習題: 添加用戶bash, testbash, basher, nologin(SHELL為/sbin/nologin),而找出當前系統上其用戶名和默認shell相同的用戶;
?
????grep選項:
????????-v: 反向選取
????????-o: 僅顯示匹配到內容
????????-i: 忽略字符大小寫
????????-E: 使用擴展正則表達式
????????-A #:打印后#行的內容
????????-B #:打印前#行的內容
????????-C #:打印#行的輸出內容
2、egrep及其擴展正則表達式
egrep:egrep = grep -E 可以使用基本的正則表達外, 還可以用擴展表達式. 注意區別.
擴展表達式:
擴展正則表達式的元字符:
????????????字符匹配:
????????????????. : 匹配其任意單個字符
????????????????[]: 匹配指定集合中的任意單個字符
????????????????[^]:匹配指定集合外的任意單個字符
????????????匹配次數限定:
????????????????*:匹配其前面的字符任意次,0,1或多次;
?????????????????: 匹配其前面字符0次或1次;
????????????????+:匹配其前面的字符至少1次;
????????????????{m}:匹配其前面的字符m次;
????????????????{m,n}:{m,}表示匹配其前面至少m次, {0,n}表示匹配其前面之多n次;
????????????錨定:
????????????????^: 行首錨定
????????????????寫在模式的最左側
????????????$: 行尾錨定
????????????????寫在模式的最右側
????????????^$: 空白行
?
????????????\<: 詞首錨定, 相當于\b
????????????????出現在要查找的單詞模式的左側;\<char
????????????\>:詞尾錨定, 相當于\b
????????????????出現在要查找的單詞模式的右側;char\>
????????????\<pattern\>: 匹配單詞
????????分組:
????????????() ---------注意grep里的是用\(\)
????????????后向引用:模式中,如果使用()實現了分組,在某行文本的檢查中,如果()的模式匹配到了某內容,此內容后面的模式中可以被引用;
????????????????\1, \2, \3
????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;
????????????或者:
????????????????a|b: a或者b
????????????????ab|cd:
?
下面我來通過大量習題講解來進一步揭開grep與egrep的神秘面紗
習題
1、顯示/proc/meminfo文件中以大寫或小寫S開頭的行;
????????????grep -i '^[s]'.* /proc/meminfo
????????????egrep ^[Ss].* /proc/meminfo
注釋:知識點 (1) 這里用到了^: 行首錨定
(2) []: 匹配指定集合中的任意單個 字符
(3)-i: 忽略字符大小寫
?
2、顯示/etc/passwd文件中其默認shell為非/sbin/nologin的用戶;
????????????grep -v /sbin/nologin$ /etc/passwd
???????? egrep -v /sbin/nologin$ /etc/passwd
注釋:知識點 (1) -v: 反向選取
(2) $: 行尾錨定, 寫在模式的最右側
????????????????
3、顯示/etc/passwd文件中其默認shell為/bin/bash的用戶;進一步:僅顯示上述結果中其ID號最大的用戶;????
grep /bin/bash /etc/passwd|sort -n -r -t: -k3 | head -1
?
?
注釋:知識點 (1)sort [option…]
-n :按數值大小排序
-r :逆序
-t :指定字段以什么為分隔符
-k # :指定用于排序的第#字段
(2)head [options]
-n #或是-# :指定前#行
4、找出/etc/passwd文件中的一位數或兩位數;
???????????????? # egrep '\<([0-9]|[1-9][0-9])\>' /etc/passwd
注釋:知識點 (1) ????\<pattern\>: 匹配單詞
5、顯示/boot/grub/grub.conf中以至少一個空白字符開頭的行;
#grep '^[[:space:]]\+' /boot/grub/grub.conf
#egrep '^[[:space:]]+' /boot/grub/grub.conf
?
注釋:知識點(1) 這里用到了^: 行首錨定
(2) ????[[:space:]] 匹配任意單個空白字符
(3) 在grep里\+:匹配其前面的字符至少1次;
(4) 在grep里\+:匹配其前面的字符至少1次;
6、顯示/etc/rc.d/rc.sysinit文件中,以#開頭,后面跟至少一個空白字符,而后又有至少一個非空白字符的行;
grep????'^#[[:space:]]\+[^[:space:]]\+' ????/etc/rc.d/rc.sysinit
注釋:知識點與第五題一樣
7、找出netstat -tan命令執行結果中以'LISTEN'(后可有空白字符)結尾的行;
netstat -tan | grep 'LISTEN[[:space:]]\+' --color=auto
注釋:知識點(1)netstat 命令用于顯示各種網絡相關信息
(2) | 為管道,連接命令,實現將前一個命令的輸出當作后一個命令的輸入;
(3) --color=auto 是增加顏色顯示
(4)其它可參照第五題
8、擴展題:新建一個文本文件,假設有如下內容:
????????????????He like his lover.
????????????????He love his lover.
????????????????He like his liker.
????????????????He love his liker.
????????????找出其中最后一個單詞是由此前某單詞加r構成的行。
?
????????????# grep '\(\<[[:alpha:]]\+\>\).*\1r' a.txt
????????????# egrep '(\<[[:alpha:]]+\>).*\1r' m.txt
注釋:知識點(1) \(\) ---grep的表示
????????????后向引用:模式中,如果使用\(\)實現了分組,在某行文本的檢查中,如果\(\)的模式匹配到了某內容,此內容后面的模式中可以被引用;
????????????????\1, \2, \3
????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;
(2) () -------注意grep里的是用\(\)
????????????后向引用:模式中,如果使用()實現了分組,在某行文本的檢查中,如果()的模式匹配到了某內容,此內容后面的模式中可以被引用;
????????????????\1, \2, \3
????????????????模式自左而右,引用第#個左括號以及與其匹配右括號之間的模式匹配到的內容;
9、顯示當前系統上root、centos或user1用戶的默認shell及用戶名;下面幾種表示方法
# cut -d: -f1,7 /etc/passwd | egrep ^'root|centos|user1'
# cut -d: -f1,7 /etc/passwd | egrep '^root|^centos|^user1'
# cut -d: -f1,7 /etc/passwd | egrep '^(root|centos|user1)'
如是有user10,則需要固定一個詞
# cut -d: -f1,7 /etc/passwd | egrep '^(root|centos|\<user1\>)'
注釋:知識點(1)cut option FILE…
-d 后邊指定字段分隔符
-f # |#-# |#,# 指定要顯示的字段(其中#表示第1段,#-#表示兩#區間內連續的段落,(#,#)表示只要兩個#段的本身)
(2)參照第五題的知識點
10、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一對小括號"()"的行;
#grep????'\<[[:alnum:]]\+\>()' /etc/rc.d/init.d/functions|cut -d' ' -f1
????#egrep????'\<[[:alnum:]]+\>\(\)' /etc/rc.d/init.d/functions|cut -d' ' -f1
注釋:知識點(1) [[:alnum:]]==[0-9a-zA-Z]
(2) 在grep里\+:匹配其前面的字符至少1次;
(3) 在grep里\+:匹配其前面的字符至少1次;
(4)在egrep里小括號()表示詞組引用,所以想表示小括號的原義需要轉義-- \(\)
11、使用echo輸出一個路徑,而使用egrep取出其基名;
???? #echo '/etc/sysconfig/' | egrep -o '[^/]+/?$'
注釋:知識點(1)基名(dirname):從文件名中去掉路徑信息,只打印
(2) -o: 僅顯示匹配到內容
(3) ?????: 匹配其前面字符0次或1次;
12、找出ifconfig命令結果中的1-255之間的數值;
???? 1.0.0.1 - 223.255.255.254
ifconfig | egrep '[0-9]|[1-9][0-9]|[1-9][0-9]{2}'
--color=auto
注釋:知識點(1)在egrep中
{m}:匹配其前面的字符m次;
13、找出ifconfig命令結果中的IP地址;
????ifconfig |egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>' --color=auto
注釋:知識點(1)四種顏色表示ip的四個段落,
(2)我們也可以簡化下,因為第二段和第三段一樣,效果如下:
ifconfig |egrep '\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\>\.(\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>\.){2}\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>' --color=auto
轉載于:https://www.cnblogs.com/na2po2lun/p/4146652.html
總結
以上是生活随笔為你收集整理的正则表达式的简单认识的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mahout基于Hadoop的CF代码分
- 下一篇: 假如,有这样的异性朋友真不错