sed-awk-正則表達式

本節內容

       正則表達式

       sed

       awk

正則表達式,又稱正規表示法,常規表示法(英語:Regular Expression),在代碼中常寫爲regex、regexp 或RE), 計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。

是指一個用來描述或匹配一系列符合某個句法規則的字符的那個字符串

用某種模式去匹配一類字符串。

 

使用grep

-v   不匹配

-n   顯示行號

 

1.正則表達式中特殊字符

(1) ^word : 待搜尋的字符串(word)在行首!

搜尋“root”開始的行:

例:

[root@xuegod63tmp]# grep root passwd

root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

[root@xuegod63tmp]#

[root@xuegod63tmp]# grep ^root passwd

root:x:0:0:root:/root:/bin/bash

 

(2)word$ :  搜尋以字符串(word)結尾的行

搜尋“bash” 結尾的行:

例:

[root@xuegod63tmp]# grep bash$ passwd

root:x:0:0:root:/root:/bin/bash

zhh:x:500:500:zhh:/home/zhh:/bin/bash

mysql:x:27:27:MySQLServer:/var/lib/mysql:/bin/bash

 

(3) \ : 將特殊符號的特殊意義去除

例:搜尋包括單引號 ' 的行 , 並把行號也打印出來

[root@xuegod63tmp]# grep \' passwd 

'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin

'p:x:4:7:lp:/var/spool/lpd:/sbin/nologin

[root@xuegod63tmp]# grep -n --color \' /tmp/passwd

 

(4) * :重複零個 到無窮多個的前一個字符

搜尋包括sp,後面o重複2次以上的行。記得要寫兩個o

[root@xuegod63tmp]# grep spoo* passwd

 

(5) [list] : 字符集合,裏面列出想要選擇的字符

搜尋包括 ga 或者 go的行:

[root@xuegod63tmp]# grep g[ao] /tmp/passwd

games:x:12:100:games:/usr/games:/sbin/nologin

gopher:x:13:30:gopher:/var/gopher:/sbin/nologin

 

(6)搜尋 不以#號 開頭的行

[root@xuegod63tmp]# grep ^# passwd       #以井號開頭的

#root:x:0:0:root:/root:/bin/bash

#bin:x:1:1:bin:/bin:/sbin/nologin

 

[root@xuegod63tmp]# grep ^[^#] passwd    # 不以井號開頭的

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

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

uucp:x:10:14:uu'p:/var/spool/uucp:/sbin/nologin

 

(7) [n1-n2]: 字符集合 ,裏面列出包括的字符範圍

1搜尋含有數字的3和4的行

[root@xuegod63tmp]#   grep [3-4] passwd --color

#adm:x:3:4:adm:/var/adm:/sbin/nologin

#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

#'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

2找出開頭爲小寫字母的行

[root@xuegod63tmp]#  grep ^[a-z] passwd    #搜尋以a到z開頭的行

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

mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin

 

搜不以字母a 到 z 開頭的行

[root@xuegod63tmp]# grep ^[^a-z] passwd

#root:x:0:0:root:/root:/bin/bash

#bin:x:1:1:bin:/bin:/sbin/nologin

 

[root@xuegod63tmp]# grep ^[^a-zA-Z] passwd

 

顯示空白行及行號:

[root@xuegod63tmp]# grep -n ^$ passwd

35:

 

3.正則表達式中  “.”代表絕對有一個任意字符的意思: 而“*”代表重複前一個到無窮次的意思

 任意長度的字符表示方法: .* 

 

尋找 r開頭 和 t 結束  且長度爲四個字符的行:

[root@xuegod63tmp]#  grep r..t passwd  --color

#root:x:0:0:root:/root:/bin/bash

operator:x:11:0:operator:/root:/sbin/nologin

ftp:x:14:50:FTPUser:/var/ftp:/sbin/nologin

 

以root開頭

[root@xuegod63tmp]#  grep ^r..tpasswd  --color

root:x:0:0:root:/root:/bin/bash

 

 

尋找oo,ooo,oooo等等的數據,也就是說,至少要有兩個o以上:

[root@xuegod63tmp]#     grep ooo* passwd  --color

root:x:0:0:root:/root:/bin/bash

#lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

 'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

尋找 g 開頭 和 g 結束的字符串,中間可有可無。

[root@xuegod63tmp]# grep ^g.*g$ passwd

glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig

 

 

sed

stremeditor  流編輯器

sed編輯器是一行一行的處理文件內容的。正在處理的內容存放在模式空間(緩衝區)內,處理完成後按照選項的規定進行輸出或文件的修改。

 

sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed 命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed 主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;

 

語法:

sed[options]  '[command]' [filename]

options:

-n 抑制自動(默認的)輸出***  讀取下一個輸入行

-e  執行多個sed指令

-f   運行腳本

-i   編輯文件內容***

-i.bak編輯的同事創造 .bak 的備份

-r  使用擴展的正則表達式 ***

 

command

在匹配後追加 ***

在匹配後插入 ***

p 打印 ***

d 刪除 ***

r/R讀取文件/一行

w 另存

查找

替換

替換

h/H(複製)拷貝/追加模式空間(緩衝區)到存放空間

g/G (粘貼)從存放空間取回/追加到模式空間

x   兩個空間內容的交換

n/N拷貝/追加下一行內容到當前

刪除 \n 之前的內容

打印 \n 之前的內容

無條件跳轉

t   滿足匹配後的跳轉

T   不滿足匹配時跳轉

 

例子:

1顯示文件第三行

[root@xuegod63tmp]# sed -n '3p' passwd

#daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

2顯示 前三行

[root@xuegod63tmp]# sed -n '1,3p' passwd

root:x:0:0:root:/root:/bin/bash

#bin:x:1:1:bin:/bin:/sbin/nologin

#daemon:x:2:2:daemon:/sbin:/sbin/nologin

 

3顯示文件除前三行之外的全部內容

[root@xuegod63tmp]# sed -n '1,3!p' passwd

#adm:x:3:4:adm:/var/adm:/sbin/nologin

glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig

 'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin

#'p:x:4:7:lp:/var/spool/lpd:/sbin/nologin

....

 

4顯示文件第三行和之後的三行

[root@xuegod63tmp]# sed -n '3,+3p' passwd

#daemon:x:2:2:daemon:/sbin:/sbin/nologin

#adm:x:3:4:adm:/var/adm:/sbin/nologin

glp:x:4:7:lp:/var/spool/lpd:/sbin/nologig

 'p'x:4:7:lp:/var/spool/lpd:/sbin/nologin

 

在文件開頭 插入 ******

[root@xuegod63tmp]#  sed  '1i******' passwd | more

如果想保存  需要重定向

sed  '1i******' passwd  > a.txt

 

 

在文件結尾追加 “@@@”

[root@xuegod63tmp]# sed '$a@@@' passwd >a.txt

 

把文件第三行替換成“qiutiandeyu”

[root@xuegod63tmp]# sed '3c qiutiandeyu' passwd

root:x:0:0:root:/root:/bin/bash

#bin:x:1:1:bin:/bin:/sbin/nologin

qiutiandeyu

 

 

複製粘貼

把文件的第二行到第四行復制到文件的末尾

[root@xuegod63tmp]# sed '2,4H;$G' passwd

 

 

 

sed中的正則:

^  $ .  *

 

例子:

1刪除空行     d  刪除

[root@xuegod63tmp]# sed '/^$/d' passwd > a.txt

 

 

把fstab 中 包含 ext4 的記錄(行) 寫入新的文件中

 

[root@xuegod63tmp]# sed '/ext4/w newfstab' /etc/fstab

[root@xuegod63tmp]# cat newfstab

UUID=bcb13b44-26f0-4f00-ac7c-71387b41c6ac/                       ext4    defaults        1 1

UUID=d4382c26-3adc-4f0b-a754-e1c85ff5a1dd/boot                   ext4    defaults        1 2

 

 

awk

awk是一種優良的文本處理工具,Linux 及 Unix 環境中現有的功能最強大的數據處理引擎之一。這種編程及數據操作語言(其名稱得自於它的創始人阿爾佛雷德.艾候、彼得.溫伯格和布萊恩.柯林漢姓氏的首個字母) 的最大功能取決於一個人所擁有的知識。awk 是Alfred Aho Per  Weinberger 和

brianKernighan 三個人姓的縮寫。

 

最簡單的說,AWK是一種用於處理文本的編程語言工具。

任何awk語句都是由模式和動作組成,一個awk腳本可以有多個語句。模式決定動作語句的觸發條件和觸發時間。

 

特殊字段:

BEGIN語句設置計數和打印頭部信息,在任何動作之前進行。END語句輸出統計結果,在完成動作之後執行

 

分隔符默認是空格,可以用-F,改變成逗號爲分隔符-F,改成冒號 -F:         

安裝軟件:

[root@xuegod63 ~]# rpm -qf `which awk`

gawk-3.1.7-10.el6.x86_64

 

例子:

1自定義年月日的顯示方式:

Year:2016       month:Fri      days:7

[root@xuegod63~]# date | awk '{print "Year:"$6 "\t month:"$2 "\tdays:"$3}'

Year:2016        month:Jun       days:17

 

準備要顯示的內容:

#vimresult.txt

andy4 85 92 78 94 88

bob6 89 90 75 90 86

claire9 84 88 80 92 84

dave5 94 52 84 86 NA

 

例2  顯示所有內容

[root@xuegod63~]# awk '{print $0}' result.txt    # $0 顯示全部

andy4 85 92 78 94 88

bob6 89 90 75 90 86

claire9 84 88 80 92 84

dave5 94 52 84 86 NA

 

例3 顯示第一列,以:作爲分隔符

[root@xuegod63tmp]# awk -F: '{print $1}' /etc/passwd 

 

例4  顯示第一列和第三列的內容

[root@xuegod63~]# awk  '{print $1,$3}' result.txt   

andy85

bob89

claire84

dave94

 

例5  打印一個文件頭,打印一個文件尾

BEGIN語句設置計數和打印頭部信息,在任何動作之前進行。

END語句輸出統計結果,在完成動作之後執行

[root@xuegod63~]# awk  'BEGIN{print"name levelresult\n"}{print $1,$2,$3} END{print"\nend of class1 results"}'result.txt

namelevel result

 

andy4 85

bob6 89

claire9 84

dave5 94

 

endof class1 results

 

 

第二列大於等於5的那些記錄

[root@xuegod63~]# awk '$2 >= 5 {print $0}' result.txt

bob6 89 90 75 90 86

claire9 84 88 80 92 84

dave5 94 52 84 86 NA

 

 

顯示用戶名爲andy或 (和) 第二列爲9的記錄

[root@xuegod63~]# awk '{ if($1 == "andy" || $2 == "9") print $0}'result.txt

andy4 85 92 78 94 88

claire9 84 88 80 92 84

 

 

[root@xuegod63~]# awk '{ if($1 == "andy" && $2 == "9") print $0}'result.txt

 


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