Linux 正則表達式

Linux 正則表達式(*****)

1、什麼是正則表達式?

簡單的說,正則表達式就是爲處理大量的字符串而定義的一套規則和方法


通過定義的這些特殊符號的輔助,系統管理員就可以快速過濾,替換或輸出需要的字符串。

Linux 正則表達式一般以行爲單位處理的。


注意事項:

a、#alias grep='grep --color=auto'  ===>以特定顏色高亮顯示匹配關鍵字

b、注意字符集,LC_ALL=C   #export LC_ALL=C


實戰舉例:

1)^ word  搜索以 word 開頭的。vi ^ 一行的開頭

2)word$   搜索以 word 結尾的。vi $ 一行的開頭

3)^$         表示空行

4).             有且只能代表任意一個字符

5) \           例 \. 就只代表點本身,轉義符號,讓有着特殊身份意義的字符,脫掉馬甲,還原原型。

6) *           例 o* 重複 0 個或多個前面的一個字符

7).*           匹配所有字符。延伸 ^.*  以任意多個字符開頭。 .*$ 以任意多個字符結尾

8)[abc]     匹配字符集合內的任意一個字符 [a-zA-Z],[0-9]

9)[^abc]   匹配不包含 ^ 後的任意字符的內容

10)a\{n,m\}  重複 n 到 m 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線

 \{n,\}   重複至少 n 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線

 \{n\}    重複 n 次,前一個重複的字符。如果用 egrep/sed -r 可以去掉斜線

        \{,m\}   最多 m 次

注意:egrep,grep -E 或 sed -r 過濾一般特殊字符可以不轉義


實驗數據:

#cd /test/oldboy/

#touch oldboy.log

#vim oldboy.log

I am oldboy teacher!

I teach linux.


I like badminton ball ,billiard ball and chinese chess!

my blog is http://oldboy.blog.51cto.com

our site is http://www.etiantian.org

my qq num is 49000448.


not 4900000448.

my god ,i am not oldbey,but OLDBOY!

oldb y

good

goood


#grep "^m" oldboy  ===>過濾出來以 m 開頭的行

#grep "m$" oldboy  ===>以 m 結尾的行

#grep -v "^$"  oldboy.log  ===>去掉空行

#grep -vn "^$"  oldboy.log  ===>顯示行號

#grep "." oldboy.log  ===> 匹配所有的,但沒有空行,匹配任意一個字符

wKiom1f15pjhftiOAAK8E0ts95s902.png-wh_50


#grep ".*" oldboy.log  ===> 匹配所有的,包括空行

wKioL1f15qbTrhy4AALTqvyNcRI658.png-wh_50


#grep "oldb.y" oldboy.log ===> 包含oldb,包含y,它兩之間的字符任意

wKiom1f15rDRgNUtAAFd8qt7H3U880.png-wh_50


#grep ".$" oldboy.log ===>以任意字符結尾

wKiom1f15r2gNn5vAAKxtk6b3_E101.png-wh_50


#grep "\.$" oldboy.log  ===>以點結尾

wKioL1f15s_whEahAADztEaRrdM738.png-wh_50


#grep  "0*" oldboy.log ===>匹配最少零個0,全匹配了

wKiom1f15trA3oKsAAL8wB_7S54973.png-wh_50


#grep -o "0*" oldboy.log ===> 精確匹配

wKioL1f15uWzfYedAACF84edXVc426.png-wh_50


#grep "[abc]" oldboy.log

wKiom1f15vGi15qMAAONXAHifc8345.png-wh_50


#grep "[^a-z]" oldboy.log ===> a 到 z 的結果不匹配

wKiom1f15vyiRhMgAAKzc-cbJQc436.png-wh_50


#grep "[^0-9]" oldboy.log  ===> 匹配非數字

#grep "0\{3\}" oldboy.log ===> 重複三個0

wKioL1f15wqBrYzRAADKM-ZdXEk459.png-wh_50


#egrep "0{3}" oldboy.log ====> 沒有轉義字符了,沒有顏色是因爲egrep沒有做別名

wKioL1f15xWgGFBvAADUOPUzPns028.png-wh_50


#grep -E "0{3}" oldboy.log 

#grep -E "0{3,5}" oldboy.log 

wKiom1f15yLQ2WfpAAGhFLZ-KfU772.png-wh_50

#grep -E "0{3,}" oldboy.log ===>至少三次

#grep -E "0{,3}" oldboy.log ===>最多三次


正則支持 grep、sed、awk

grep 一般常用參數

-a:在二進制文件中,以文本文件的方式搜索數據

-c:計算找到‘搜索字符串’的次數

-o:僅顯示出匹配 regexp 的內容(用於統計出現在文中的次數)

-i*****:忽略大小寫的不同,所以大小寫視爲相同

-n*****:在行首顯示行號

-v*****:反向選擇,即顯示沒有‘搜索字符串’內容的那一行

-E*****:擴展的 grep,即 egrep

--color=auto:以特定顏色高亮顯示匹配關鍵字

-A:after 的意思,顯示匹配字符串及其後 n 行的數據

-B:before 的意思,顯示匹配字符串及其前 n 行的數據

-C:顯示匹配字符串及其前後各 num 行

提示:-i,-v 爲常用參數


後向引用

#echo "oldboy  oldgirl"|sed -r 's#(.*)  (.*)#\1  \2#g'

wKiom1f15zHg74FUAAD41kUB18k587.png-wh_50


取 IP 地址

#ifconfig eth0|sed -n '2p'|sed -r 's#.* addr:##g'|sed -r 's# Bc.*$##g'   或

#ifconfig eth0|sed -n '2p'|sed -r 's#.*dr:(.*) Bc.*#\1#g'   或

#ifconfig eth0|sed -rn '2s#.*dr:(.*)  Bc.*$#\1#gp'

wKioL1f152zT78TrAACURxd63MQ082.png-wh_50


擴展的正則表達式:ERE(主要用於 egrep 或者 grep  -E)

1) +  重複一個或一個以上前面的字符;(* 是 0 或多個)

2) ? 重複 0 個或一個 前面的字符

3) |   用或的方式查找多個符合的字符串

4) ()  找出“用戶組”字符串

5) \b  匹配單詞的邊界

6) \w 匹配任意一個字符和數字

7) \W 匹配非字符與數字


例子:

\b  匹配單詞的邊界

# grep "oldboy" oldboy.log

# grep "\boldboy\b" oldboy.log

wKiom1f153uAE-ThAAA4rQ6DMrA984.png-wh_50


\w 匹配任意一個字符和數字     \W 匹配非字符與數字

# grep "\w" oldboy.log 

# grep "\W" oldboy.log 

wKiom1f154qzKUrGAABQtt64wqU764.png-wh_50


+ 一個或多個

#grep -Eo "g+d" oldboy.log  ===> 重複g;gd 、ggd ...

#grep -Eo "go+d" oldboy.log ===> 重複o;god 、good ...

#egrep -o "go+d" oldboy.log ===> 沒有顏色

#grep -o "go+d" oldboy.log ===> 沒有;因爲 + 不適合 grep

#grep -Eo "g?d" oldboy.log ===> 1個g或沒有;gd、d

#grep -Eo "go?d" oldboy.log ====> 1個o或沒有;god 、gd


| 表示同時過濾多個字符串

#egrep "god|good" oldboy.log

#grep -E "g?d|good" oldboy.log

#grep -E "g(la|oo)d" oldboy.log 

wKioL1f155nilKdMAAUVoVw0D4s839.png-wh_50

wKioL1f156zxNRmfAAX_9W5Ov4o914.png-wh_50

wKiom1f1567TzANMAAWPV21NZD8567.png-wh_50


#touch {a,b,c}.log

# ll *.log

# ll ?.log

# ll oldbo?.log  

# ll ??????.log

# touch log.{1..3}

# touch log.{4,5,6}

wKioL1f158Th9oGfAACVWzZ8n80951.png-wh_50


# echo date

# echo `date`

# echo 'date'

# echo "date"

# a=oldboy    # echo "$a"    # echo '$a'   

# ech && echo 1

# echo && echo 1

# ech || echo 1

# echo || echo1

# ech 2>/dev/null || echo 1

wKiom1f159GAgzKVAABiwA3Ywcw553.png-wh_50


做題:

1、取 stat /etc/hosts 裏 644

2、取 ifconfig eth0 HWADDR


解答

1、取 stat /etc/hosts 裏 644

解法一:

# stat /etc/hosts

  File: "/etc/hosts"

  Size: 95              Blocks: 8          IO Block: 4096   普通文件

Device: fd00h/64768d    Inode: 1441820     Links: 2

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

Access: 2016-09-19 22:20:01.383437447 +0800

Modify: 2016-09-06 00:31:11.958161872 +0800

Change: 2016-09-06 00:31:11.995163159 +0800


# stat /etc/hosts|sed -n '4p'

Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

# stat /etc/hosts|sed -n '4p'|awk -F "[0/]" '{print $2}'

644


解法二:

# stat /etc/hosts|awk -F '[0/]' 'NR==4 {print $2}'

解法三:

# stat /etc/hosts|sed -nr '4s#^.*\(0(.*)/-.*$#\1#gp'

解法四:

# stat -c %a /etc/hosts

解法五:

#ll a.log|cut -c 2-10|tr rwx- 4210 |awk -F "" '{print $1+$2+$3 $4+$5+$6 $7+$8+$9}'

wKioL1f15-HAo8x8AAAhhODdcOE113.png-wh_50


2、取 ifconfig eth0 HWADDR

# ifconfig eth0|sed -nr '2s#^.*dr:(.*) Bca.*$#\1#gp'

wKiom1f15-3yqD-wAABmnO8YPjs945.png-wh_50


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章