本節內容
正則表達式
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:
a 在匹配後追加 ***
i 在匹配後插入 ***
p 打印 ***
d 刪除 ***
r/R讀取文件/一行
w 另存
s 查找
c 替換
y 替換
h/H(複製)拷貝/追加模式空間(緩衝區)到存放空間
g/G (粘貼)從存放空間取回/追加到模式空間
x 兩個空間內容的交換
n/N拷貝/追加下一行內容到當前
D 刪除 \n 之前的內容
p 打印 \n 之前的內容
b 無條件跳轉
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