Linux-正則表達式

RegEx

REGEXP:Regular Expression 由一類特殊字符及文本字符所編寫的模式,其中有些字符(元字符)不表示字符字面意義,而表示控制或通配的功能

程序支持:grep,sed,awk,vim, less,nginx,varnish等

分兩類:

基本正則表達式:BRE

擴展正則表達式:ERE

grep -E, egrep

正則表達式引擎:

采用不同算法,檢查處理正則表達式的軟件模塊

PCRE(Perl Compatible Regular Expressions)

元字符分類:字符匹配、匹配次數、位置錨定、分組

man 7 regex

 

基本正則表達式元字符

字符匹配:

. 匹配任意單個字符

[] 匹配指定范圍內的任意單個字符

[^] 匹配指定范圍外的任意單個字符

[:alnum:] 字母和數字

[:alpha:] 代表任何英文大小寫字符,亦即 A-Z, a-z

[:lower:] 小寫字母 [:upper:] 大寫字母

[:blank:] 空白字符(空格和制表符)

[:space:] 水平和垂直的空白字符(比[:blank:]包含的范圍廣)

[:cntrl:] 不可打印的控制字符(退格、刪除、警鈴…)

[:digit:] 十進制數字 [:xdigit:]十六進制數字

[:graph:] 可打印的非空白字符

[:print:] 可打印字符

[:punct:] 標點符號

 

轉義\,如.表示任意單個字符,\.則表示.本身

.如果放在[]里邊,就表示.本身,不需要轉義

 

匹配次數:用在要指定次數的字符后面,用于指定前面的字符要出現的次數

* 匹配前面的字符任意次,包括0次

貪婪模式:盡可能長的匹配

.* 任意長度的任意字符

\? 匹配其前面的字符0或1次

\+ 匹配其前面的字符至少1次

\{n\} 匹配前面的字符n次

\{m,n\} 匹配前面的字符至少m次,至多n次

\{,n\} 匹配前面的字符至多n次

\{n,\} 匹配前面的字符至少n次

 

位置錨定:定位出現的位置

^ 行首錨定,用于模式的最左側

$ 行尾錨定,用于模式的最右側

^PATTERN$ 用于模式匹配整行

^$ 空行

^[[:space:]]*$ 空白行

\< 或 \b 詞首錨定,用于單詞模式的左側

\> 或 \b 詞尾錨定;用于單詞模式的右側

\<PATTERN\> 匹配整個單詞

 

用grep命令摘出ifconfig ens33命令里的ip地址:

[root@centos7 ~]#ifconfig ens33 | grep -o “[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}” | head -n1

[root@centos7 ~]#ifconfig ens33 | grep -o “inet [0-9.]\+” | cut -d ” ” -f2

……

 

過濾空行

[root@centos7 data]#grep -v “^[[:space:]]*$” f1

 

分組:\(\) 將一個或多個字符捆綁在一起,當作一個整體進行處理,如:\(root\)\+

分組括號中的模式匹配到的內容會被正則表達式引擎記錄于內部的變量中,這些變量的命名方式為: \1, \2, \3, …

\1 表示從左側起第一個左括號以及與之匹配右括號之間的模式所匹配到的字符

示例: \(string1\+\(string2\)*\)

\1 :string1\+\(string2\)*

\2 :string2

后向引用:引用前面的分組括號中的模式所匹配字符,而非模式本身

或者:\|

示例:a\|b: a或b C\|cat: C或cat \(C\|c\)at:Cat或cat

 

查看系統大版本號

[root@centos7 ~]#grep -o “[0-9]\+” /etc/redhat-release | head -n1

[root@centos7 ~]#grep -o ” [0-9]\+” /etc/redhat-release | grep -o “[0-9]\+”

 

windows中的正則表達式:cmd>findstr ?

 

練習

1、顯示/proc/meminfo文件中以大小s開頭的行(要求:使用兩種方法)

[root@centos7 ~]#grep -i “^s” /proc/meminfo

[root@centos7 ~]#grep “^[Ss].*” /proc/meminfo

2、顯示/etc/passwd文件中不以/bin/bash結尾的行

[root@centos7 ~]#cat /etc/passwd | grep -v “/bin/bash$”

3、顯示用戶rpc默認的shell程序

[root@centos7 ~]#cat /etc/passwd | grep “^rpc\>” | cut -d: -f7

/sbin/nologin

4、找出/etc/passwd中的兩位或三位數

[root@centos7 ~]#cat /etc/passwd | grep -wo “[[:digit:]]\{2,3\}”

5、顯示CentOS7的/etc/grub2.cfg文件中,至少以一個空白字符開頭的且后面有非空白字符的行

[root@centos7 ~]#cat /etc/grub2.cfg | grep “^[[:space:]].*[^[:space:]].*”

6、找出“netstat -tan”命令結果中以LISTEN后跟任意多個空白字符結尾的行

[root@centos7 data]#netstat -tan | grep “LISTEN[[:space:]]*$”

7、顯示CentOS7上所有系統用戶的用戶名和UID

[root@centos7 data]#cat /etc/passwd | cut -d: -f1,3 | grep? “:[1-9][0-9]\{,2\}$”

8、添加用戶bash、testbash、basher、sh、nologin(其shell為/sbin/nologin),找出/etc/passwd用戶名和shell同名的行

[root@centos7 ~]#cat /etc/passwd | grep “^\(.\+\):.*/\1$”

[root@centos7 ~]#cat /etc/passwd | grep “^\(.*\):.*/\1$”

sync:x:5:0:sync:/sbin:/bin/sync

shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

halt:x:7:0:halt:/sbin:/sbin/halt

bash:x:1001:1001::/home/bash:/bin/bash

nologin:x:1005:1005::/home/nologin:/sbin/nologin

9、利用df和grep,取出磁盤各分區利用率,并從大到小排序

[root@centos7 ~]#df | grep “/dev/sd” | grep -o “[0-9]*%” | sort -nr

15%

8%

1%

 

egrep及擴展的正則表達式

egrep = grep -E

egrep [OPTIONS] PATTERN [FILE…]

擴展正則表達式的元字符:

字符匹配:

. 任意單個字符

[] 指定范圍的字符

[^] 不在指定范圍的字符

 

擴展正則表達式

次數匹配:

*:匹配前面字符任意次

?: 0或1次

+:1次或多次

{m}:匹配m次

{m,n}:至少m,至多n次

 

位置錨定:

^ :行首

$ :行尾

\<, \b :語首

\>, \b :語尾

分組:

()

后向引用:\1, \2, …

或者:

a|b: a或b

C|cat: C或cat

(C|c)at:Cat或cat

 

練習

1、顯示三個用戶root、mage、qjy的UID和默認shell

[root@centos7 ~]#cat /etc/passwd | egrep -w “^(root|mage|qjy)” | cut -d: -f1,3,7

2、找出/etc/rc.d/init.d/functions文件中行首為某單詞(包括下劃線)后面跟一個小括號的行

[root@centos7 ~]#cat /etc/rc.d/init.d/functions | grep “^[[:alpha:]_].*()”

3、使用egrep取出/etc/rc.d/init.d/functions中其基名

[root@centos7 ~]#echo /etc/rc.d/init.d/functions | egrep -o “[^/]*/?$”

4、使用egrep取出上面路徑的目錄名

echo /etc/rc.d/init.d/functions | egrep -o “.*/[^$]” | egrep -o “.*/”

5、統計last命令中以root登錄的每個主機IP地址登錄次數

last | egrep root | egrep -wo “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+” | sort | uniq -c | sort -nr

6、利用擴展正則表達式分別表示0-9、10-99、100-199、200-249、250-255

[root@centos7 ~]#egrep -w [0-9]

[root@centos7 ~]#egrep -w [1-9][0-9]

[root@centos7 ~]#egrep -w 1[0-9] [0-9]

[root@centos7 ~]#egrep -w 2[0-4][0-9]

[root@centos7 ~]#egrep -w 25[0-5]

7、顯示ifconfig命令結果中所有IPv4地址

[root@centos7 ~]#ifconfig | egrep -wo “(([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])”

8、將此字符串:welcome to magedu linux 中的每個字符去重并排序,重復次數多的排到前面

[root@centos7 ~]#echo “welcome to magedu linux” | egrep -o [a-z’ ‘] | sort | uniq -c | sort -nr

[root@centos7 ~]#echo “welcome to magedu linux” | egrep -o . | sort | uniq -c | sort -nr

 

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

(1)
qjyqjy
上一篇 2018-04-08
下一篇 2018-04-08

相關推薦

  • linux文件管理常用命令

    日常管理linux文件

    Linux筆記 2018-03-31
  • 網絡管理 tcp/udp詳解 (傳輸層)

    簡介: TCP和UDP的區別 TCP是面向連接的傳輸控制協議,而UDP提供了無連接的數據報服務。 TCP具有高可靠性,確保傳輸數據的正確性,不出現丟失或亂序;UDP在傳輸數據前不建立連接,不對數據報進行檢查與修改,無須等待對方的應答,所以會出現分組丟失、重復、亂序,應用程序需要負責傳輸可靠性方面的所有工作; UDP具有較好的實時性,工作效率較TCP協議高; …

    2018-05-01
  • 手把手系列(四)教你用kickstart自動化安裝CentOS系統

    KickStart是一種半自動化的安裝方式。安裝者完全可以只告訴安裝程序從何處獲取ks.cfg文件,然后去忙自己的事情。等安裝完畢,安裝程序會根據ks.cfg中設置的重啟選項來重啟系統,并結束安裝。

    2018-05-24
  • centos6啟動流程

    這是第四次

    2018-05-13
  • RHEL7.2搭建yum源

    我在RHEL7.2搭建本地yum時發現突然報錯了。 查看了一下報錯信息顯示 加載插件:langpacks,產品ID,搜索禁用回購,訂閱管理器該系統未注冊到紅帽訂閱管。你可以使用subscription-m急于注冊.repolist:0由于Redhat的yum在線更新是收費的,如果沒有注冊的話是不能使用的,即不能在線安裝軟件。 我只好用CentOS的yum來替…

    2018-04-19
欧美性久久久久