1. 程式人生 > >Extended Regular Expression 擴展正則的使用

Extended Regular Expression 擴展正則的使用

linux grep sed awk



作者:Georgekai

歸檔:學習筆記

2017/12/27





本章正題:Extended Regular Expression

1.1 擴展正則

1.1.1 {} o{n,m} 前一個字符至少連續出現n次,最多連續出現了m

1:最少連續出現3個0,最多連續出現4個0

[root@georgekai oldboy]# egrep '0{3,4}' oldboy.txt -o

my qq is 49000448

not 4900000448.

註:1. 為什麽不出現1次或2次呢,因為貪婪性

2. 如果是這一行有5個0,那麽最後一個0不會是查找的對象,因為最少滿足3個0


2:只要連住出現3次的0

[root@georgekai oldboy]# egrep '0{3}' oldboy.txt

my qq is 49000448

not 4900000448.

3:取出數字 49000448 4900000448

[root@georgekai oldboy]# egrep '[0-9]{3,10}' oldboy.txt -o

49000448

4900000448

1.1.2 ? 前一個字符連續出現0次或1

1:

[root@georgekai oldboy]# egrep 'go?d' good.txt

gd

god

ERE小結:

1. + 一般與[ ]進行配合,可以把各種連續的東西取出來

2. | 或者

3. ( ) 表示一個整體,後向引用,主要給sed使用

4. {} 0{n,m} 0至少連續出現

n次,最多出現m

5. ? 前一個字符連續出現0次或1

1.2 基礎正則與擴展正則的區別:

基礎正則: grep /sed /awk

擴展正則: grep -E /egrep /sed -r /awk

1.2.1 \ 撬棍 可以取消特殊含義 也可以添加特殊含義

grep 中想用egrep的特殊符號,需要用撬棍

1.3 正則總結

1. grep/egrep

2. grep/egrep -o

3. 一步一步進行分解 (明白每一步的含義,一步一步來)

1.4 第三關練習題講解:

1.4.1 取出網卡的ip地址

技術分享圖片


1:sed 和 | 的應用

[root@georgekai oldboy]# ifconfig eth0 |sed -n '2p'| sed -r 's#^.*st:| Ma.*##g'

10.0.0.255

註:| 或者 ,這裏表示排除|前後的內容,取出中間的內容

2:sed 的精簡方法 和 | 的應用

[root@georgekai oldboy]# ifconfig eth0 |sed -nr '2s#.*t:| M.*##gp'

10.0.0.255

註:| 或者 ,這裏特指表示排除 | 前面和後面的內容,取出中間的內容

3: ()反向引用

[root@georgekai oldboy]# ifconfig eth0 |sed -n '2p'|sed -r 's#.*t:(.*) M.*#\1#g'

10.0.0.255

4:把多個空格指定為一把刀(分隔符)

[root@georgekai oldboy]# ifconfig eth0 |awk 'NR==2'|awk -F "[ :]" '{print $13}'

10.0.0.203

: 1. [ :] 指定了空格和冒號倆個分隔符

2. -F "[ :]+" 的執行過程:先找出[ :]+ 匹配到了什麽內容,用egrep '[ :]+' -o 查看。

5:awk 的精簡方法

[root@georgekai oldboy]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'

10.0.0.203

註:{} 裏面的相當於是命令 , {}外面的相當於條件

6:利用()把裏面的內容看成一個整體

[george@georgekai ~]$ ifconfig eth0 |awk 'NR==2'|egrep '([0-9]+\.{,1}){4}' -o

其他取ip的方法:

1. [root@georgekai oldboy]# hostname -i 註:只取使用這塊網卡的ip

10.0.0.203

[root@georgekai oldboy]# hostname -I

10.0.0.203

2. [root@georgekai oldboy]# ip a s eth0 註:取出這eth0的ip

1.4.2 ip a s eth0 顯示所有網卡的ip地址

1:

[root@georgekai oldboy]# ip a

2:

[root@georgekai oldboy]# ip a s eth0

註:全稱 ip address show eth0

3; awk 的方法

[root@georgekai oldboy]# ip a s eth0 | awk 'NR==3'|awk -F "[ /]+" '{print $3}'

10.0.0.203

4:sed 的方法

[root@georgekai oldboy]# ip a s eth0 | sed -nr '3s#.*t |/24.*##gp'

10.0.0.203

1.4.3 取出/etc/hosts文件中的權限

1:4種方法

註意:.*貪婪性和需要轉義的符號

[root@georgekai oldboy]# stat /etc/hosts | sed -nr '4s#.*\((.*)/-.*#\1#gp'

0644

[root@georgekai oldboy]# stat /etc/hosts | awk -F "[(/]" 'NR==4{print $2}'

0644

[root@georgekai oldboy]# stat /etc/hosts | sed -nr '4s#.*\(|/-.*##gp'

0644

[root@georgekai oldboy]# stat /etc/hosts | sed -n '4p'|tr '/' '('|cut -d "(" -f2

0644

2:

[root@georgekai oldboy]# stat -c%a /etc/hosts

644

1.4.4 已知/oldboy/test.txt文件內容為

oldboy

xizi


xiaochao

請問如何把文件中的空格過濾掉(要求命令行實現)。

例:

[root@georgekai oldboy]# grep '.' test.txt

[root@georgekai oldboy]# sed '/^$/d' test.txt

[root@georgekai oldboy]# awk '!/^$/' test.txt

1.4.5 已知/oldboy/ett.txt 文件內容為:

oldboy

oldboooy


test

請使用正則匹配的方式過濾出前兩行內容!

例:

[root@georgekai oldboy]# grep '^o' ett.txt

oldboy

olldboooy

[root@georgekai oldboy]# sed -rn '/[lo]+/p' ett.txt

oldboy

olldboooy

註:可用於過濾包含的字符串,在不知道那一行的情況下能達到和egrep一樣的效果。

[root@georgekai oldboy]# awk '/^[a-o]/' ett.txt

oldboy

olldboooy

1.4.6 /etc/sudoers中帶有localhost=/sbin/shutdown -h now ,並將now更改為kai

[george@georgekai oldboy]$ cat /etc/sudoers | sed -nr '/.*local.*now$/s#now#kai#gp'

總結:grep 擅長 過濾 找東西

sed 取行 過濾 替換

awk 取列 過濾 計算 統計



有問題的小夥伴,歡迎回復

關註微信公眾號:linxu運維菜鳥之旅

Extended Regular Expression 擴展正則的使用