正則表達式詳解

正則表達式詳解

## 一、定義## 一、定義正則表達式,Regular Expression,在代碼中常簡寫為regex、regexp或RE,是計算機科學的一個概念。正則表通常被用來檢索、替換那些符合某個模式(規則)的文本。是對字符串(包括普通字符(例如,a 到 z 之間的字母)和特殊字符(稱為“元字符”))操作的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符串”,這個“規則字符串”用來表達對字符串的一種過濾邏輯。正則表達式是一種文本模式,模式描述在搜索文本時要匹配的一個或多個字符串。
## 二、分類(1) 基本正則表達式:BRE,Basic RE(2) 擴展正則表達式:ERE,Extended RE
## 三、元字符上述二者的元字符不同,說到元字符,要介紹一下它的概念:元字符:meta character, 不能夠再被分割,用于表達通配或控制的功能。
有一些還有一些特殊的通配符,還需要再加上[]才能使用,這些也支持取反格式:[^[]]
通配符號 | 含義———— | —— [:space:] | 空白字符[:punct:] | 標點符號[:lower:] | 所有小寫字母[:upper:] | 所有大寫字母[:alpha:] | 所有大小寫字母[:digit:] | 所有數字[:alnum:] | 所有數字和大小寫字母
**1. 基本正則表達式的元字符****(1) 字符匹配**
符號 | 含義—— | ——. | 匹配任意單個字符[] | 匹配指定范圍內的任意單個字符[^] | 匹配指定范圍外的任意單個字符示例:`~]# grep “r[[:alpha:]][[:alpha:]]t” /etc/passwd`在/etc/passwd文件中,匹配r和t之間只能出現兩個字母的行。**(2) 匹配次數**用在要制定其出現的次數的字符的后面,用于限制其前面字符出現的字數
符號 | 含義—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意長度的任意字符\\? | 匹配其前面的字符0次或1次,即前面的字符是可有可無的\\+ | 匹配其前面的字符1次或多次,即前面的字符要出現至少一次\\{m\\} | 匹配其前面的字符m次\\{m,n\\} | 匹配其前面的字符至少m次,至多n次其中,”\\”符號僅用于基本正則表達式匹配,如果擴展正則表達式則不需要”\\”做轉義。
> 正則表達式默認工作在貪婪模式例如,grep “r.*” /etc/passwd,在匹配時,會匹配r字符開頭一直到最后的所有字串。
**(3) 位置錨定**使用場景:有時需要限定匹配的字符串只能出現在一行的某個位置,則需要使用位置錨定
符號 | 含義—— | ——^ | 行首錨定,用于模式的最左側$ | 行尾錨定,用于模式的最右側^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 詞首錨定,用于單詞模式的左側\\> 或 \\b | 詞尾錨定,用于單詞模式的右側\\<PATTERN\\> | 精確匹配單詞
練習題:(1) 顯示/etc/passwd文件中,不以/bin/bash結尾的行;`~]# grep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的兩位數或三位數;`~]# grep “\<[[:digit:]]\{2,3\}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一個空白字符開頭,且后面存在非空白字符的行;`~]# grep “^[[:space:]]\+[^[:space:]]\+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的結果中,以“LISTEN”后跟0、1或多個空白字符結尾的行;`~]# netstat -tan | grep “\<LISTEN[[:space:]]*$”`**(4) 分組及引用**使用場景:- 有時需要匹配多個字符的組合出現0、1或多次,這就需要將這多個字符組成一組,一起進行后續的次數匹配或位置錨定;- 有時需要讓前面匹配到的字符串后面再次出現;
**分組符號:**\\(PATTERN\\) : 將某個匹配模式分組,例如\\(xy\\)*ab,表示前面的xy是一個整體,可以一起出現0、1或多次。> 注意:括號可嵌套,但不可交叉!
**引用符號:**分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為\1, \2, \3 …,其中
符號 | 含義—— | ——\1 | 模式從左側起,第一個括號以及與之匹配的右括號之間的模式所匹配到的字符;\2 | 模式從左側起,第二個括號以及與之匹配的右括號之間的模式所匹配到的字符;\3 | 模式從左側起,第三個括號以及與之匹配的右括號之間的模式所匹配到的字符;示例:編輯一個文件,其中包含如下內容:He loves his lover.He likes his lover.She like her liker.She loves her liker.并篩選出前后兩個lxxe字段在同一行中是相同的字段。“`~]# vim lover.txtHe loves his lover.He likes his lover.She like her liker.She loves her liker.~]# grep “\(l..e\).*\1” lover.txtHe loves his lover.She like her liker.“`**2.擴展正則表達式的元字符**egrep,支持擴展的正則表達式實現類似于grep文本過濾功能,功能與grep -E相同。**(1) 字符匹配**

符號 | 含義—— | ——. | 匹配任意單個字符[] | 匹配指定范圍內的任意單個字符[^] | 匹配指定范圍外的任意單個字符
**(2) 匹配次數**用在要制定其出現的次數的字符的后面,用于限制其前面字符出現的字數
符號 | 含義—— | ——* | 匹配前面的字符任意次,0次,1次,多次均可.* | 匹配任意長度的任意字符? | 匹配其前面的字符0次或1次,即前面的字符是可有可無的+ | 匹配其前面的字符1次或多次,即前面的字符要出現至少一次{m} | 匹配其前面的字符m次{m,n} | 匹配其前面的字符至少m次,至多n次
**(3) 位置錨定**使用場景:有時需要限定匹配的字符串只能出現在一行的某個位置,則需要使用位置錨定
符號 | 含義—— | ——^ | 行首錨定,用于模式的最左側$ | 行尾錨定,用于模式的最右側^PATTERN$ | 用模式匹配整行^$ | 匹配空白行,不包括任何字符,包括空格\\< 或 \\b | 詞首錨定,用于單詞模式的左側\\> 或 \\b | 詞尾錨定,用于單詞模式的右側\\<PATTERN\\> | 精確匹配單詞
**(4) 分組及引用**使用場景:- 有時需要匹配多個字符的組合出現0、1或多次,這就需要將這多個字符組成一組,一起進行后續的次數匹配或位置錨定;- 有時需要讓前面匹配到的字符串后面再次出現;
**分組符號:**(PATTERN) : 將某個匹配模式分組,例如(xy)*ab,表示前面的xy是一個整體,可以一起出現0、1或多次。> 注意:括號可嵌套,但不可交叉!
**引用符號:**分組括號中的模式匹配到的內容會被正則表達式引擎自動記錄于內部的變量中,這些變量為\1, \2, \3 …,其中
符號 | 含義—— | ——\1 | 模式從左側起,第一個括號以及與之匹配的右括號之間的模式所匹配到的字符;\2 | 模式從左側起,第二個括號以及與之匹配的右括號之間的模式所匹配到的字符;\3 | 模式從左側起,第三個括號以及與之匹配的右括號之間的模式所匹配到的字符;
**(5) 或者符號“|”**或者符號“|”代表是的該符號整個左側和整個右側。例如:
表現形式 | 含義———— | ——a \| b | 表示a或者bC \| cat | 表示C或者cat(C \| c)at | 表示Cat或cat
egrep練習題:(1) 顯示/etc/passwd文件中,不以/bin/bash結尾的行;`~]# egrep -v “/bin/bash$” /etc/passwd`(2) 找出/etc/passwd文件中的兩位數或三位數;`~]# egrep “\<[[:digit:]]{2,3}\>” /etc/passwd`(3) 找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中以至少一個空白字符開頭,且后面存在非空白字符的行;`~]# egrep “^[[:space:]]+[^[:space:]]+” /etc/rc.d/rc.sysinit`(4) 找出“netstat -tan”命令的結果中,以“LISTEN”后跟0、1或多個空白字符結尾的行;`~]# netstat -tan | egrep “\<LISTEN[[:space:]]*$”`(5) 找出/proc/meminfo文件中,所有以大寫或小寫s開頭的行;至少有三種實現方式。方法1:`~]# grep -i “^s” /proc/meminfo`方法2:`~]# grep -E “^(s|S)” /proc/meminfo`方法3:`~]# grep “^[sS]” /proc/meminfo`(6) 顯示當前系統上root、centos或user1用戶的相關信息;“`~]# grep -E “^(root|centos|user1)\>” /etc/passwdroot:x:0:0:root:/root:/bin/bashcentos:x:500:500::/home/centos:/bin/bashuser1:x:501:501::/home/user1:/bin/bash“`(7) 找出/etc/rc.d/init.d/functions文件中,某單詞后面跟一個小括號的行;`~]# egrep “[_[:alnum:]]+\(\)” /etc/rc.d/init.d/functions`> 這里面要注意”[\_[:alnum:]]+\(\)” 的表達方式,代表()之前,可以是字母、數字以及_字符。
(8) 使用echo命令輸出一個絕對路徑,使用egrep取出其基名;`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “[^/]+/?$” | cut -d’/’ -f1`進一步:取出其路徑名。`~]# echo “/etc/sysconfig/network-scripts/ifcfg-eth0” | egrep -o “/.*/”`(9) 找出ifconfig命令結果中的1-255之間的數值;`~]# ifconfig | egrep –color=auto ‘\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>’ `(10) 找出ifconfig命令結果中的IP地址;`~]# ifconfig | egrep “\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>.\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>”`> 這個地方需要注意的就是:IP地址的特點是a.b.c.d,其中,a,d為1-254的數字;b,c為0-254的數字;
(11) 添加用戶bash,testbash,basher以及nologin(其shell為/sbin/nologin);而后找出/etc/passwd文件中用戶名同shell名的行;“`~]# useradd bash~]# useradd testbash~]# useradd basher~]# useradd -s /sbin/nologin nologin~]# tail -4 /etc/passwdbash:x:502:502::/home/bash:/bin/bashtestbash:x:503:503::/home/testbash:/bin/bashbasher:x:504:504::/home/basher:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin
~]# egrep “^(\<[^:]+\>).*\1$” /etc/passwdsync:x:5:0:sync:/sbin:/bin/syncshutdown:x:6:0:shutdown:/sbin:/sbin/shutdownhalt:x:7:0:halt:/sbin:/sbin/haltbash:x:502:502::/home/bash:/bin/bashnologin:x:505:505::/home/nologin:/sbin/nologin“`> 注意:當無須用到元字符去編寫模式時,使用**fgrep**必能更好!?。?!

本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/87468

(1)
N27_sapbcsN27_sapbcs
上一篇 2017-09-20 17:47
下一篇 2017-09-20 17:49

相關推薦

  • keepalived實現lvs高可用并負載均衡lamp

    一、安裝lamp     1、安裝httpd(172.16.23.211) [root@cs1 ~]# yum install -y httpd     2、安裝php(172.16.23.211) [root@cs1 …

    Linux干貨 2016-05-14
  • 對文件目錄操作命令詳解

    對文件目錄操作命令詳解 cd——切換目錄 pwd——顯示當前工作目錄 ls——列出目錄內容 touch——創建空文件和刷新時間 stat——查看文件狀態 cp——復制文件和目錄 mv——移動和重命名文件 rm——刪除文件或目錄 目錄操作 tree 顯示目錄樹 mkdir 創建目錄 rmdir 刪除空目錄 rm -r 遞歸刪除目錄樹 alias——命令別名 文…

    Linux干貨 2016-09-06
  • CentOS啟動流程排錯

    grub legacy CentOS 6啟動流程: POST –> Boot Sequence(BIOS) –> Boot Loader –> Kernel(ramdisk) –> rootfs –> switchroot –> /sbin/init …

    Linux干貨 2016-09-13
  • 第二周作業

    1. Linux上文件管理類命令總結及示例 文件管理命令主要由查看類命令和管理類命令組成 查看類命令 cat:顯示文本 cat [OPTION]… [FILE].. tac:倒序查看文件內容 tac [OPTION]… [FILE].. head:顯示文件前幾行內容 head [OPTION]… [FILE].. -n#:指定獲取前#行,也可直接使用-# -…

    Linux干貨 2016-12-10
  • 網絡配置詳解(一)

    Linux網絡屬性配置      ifcfg命令家族:ifconfig, route, netstat      ifconfig命令:      ifconfig [INTERFACE]      # ifconfig -a 顯示所有接口…

    Linux干貨 2017-01-02
  • 樹 非線性結構 樹是n(n >= 0)個元素的集合: (1)每個元素稱為結點(node); (2)有一個特定的結點,稱為根結點或根(root); (3)除根結點外,其余結點被分成m(m>=0)個互不相交的有限集合,而每個子集又都是一棵樹(稱為原樹的子樹Subtree) 注意 n = 0時,稱為空樹 樹只有一個特殊的沒有前驅的元素,稱為樹的根(Ro…

    2017-10-16
欧美性久久久久