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 20:05
下一篇 2018-04-08 20:14

相關推薦

  • Linux第一周命令總結

    hostname? 完整主機名? cat +文件路徑 可查看文件信息 cat /etc/centos-release 查看文件? 版本的名稱、發行時間所有shell cat/etc/shells? 顯示當前系統使用的 lsd_release -a? 命令? 查看版本 /etc/centos-release 是文本文件? cat是查看文本的命令 uname-r…

    2018-07-22
  • 第四周課程總結

    sed高級編輯命令模式空間相當于正在處理數據的這塊空間保持空間相當于倉庫,臨時存放暫時沒有處理完的半成品的空間P(大寫):打印模式空間開端至\n內容,并追加到默認輸出之前(即只打印第一行)h: 把模式空間中的內容覆蓋至保持空間中H:把模式空間中的內容追加至保持空間中g: 從保持空間取出數據覆蓋至模式空間G:從保持空間取出內容追加至模式空間x: 把模式空間中的…

    Linux筆記 2018-04-22
  • 企業監控Zabbix-myself

    基礎

    2018-04-10
  • TR | TEE

    tr命令 管道 tee

    2018-04-16
  • 權限管理

    權限管理 普通權限 通過劃分為三種人來管理,所有者u,所屬組g,其他人o,所有人a 文件 刪除文件用文件所在文件夾的寫權限來決定 讀寫權限root不受控制,執行受控制 對于目錄沒有執行權限,無法進入目錄,無法查看目錄內文件屬性,無法查看文件內容 執行權限是基礎權限沒有執行讀寫權限無用 程序要運行,所在目錄要有執行權限 普通用戶無法更改文件的所有者,要更改文件…

    Linux筆記 2018-03-31
欧美性久久久久