shell腳本(五)
4、sed和awk
(1)sed
a、常用參數
#文件編輯工具,可對文本文件和標準輸入進行編輯,標準輸入可以是鍵盤輸入、
#文件重定向、字符串、變量、以及管道文本。
#-n:不打印所有行到標準輸出;-e:將下一個字符串解析爲sed編輯命令
#-f:調用sed腳本文件
b、定位文本
#x:指定行號;x,y:指定從x行到y行範圍;
#/pattern/:查詢包含模式的行;
#/pattern/pattern/:查詢包含兩個模式的行;
#/pattern/,x:從與pattern匹配行到x行之間的行
#x,/pattern/:從x行到與/pattern/匹配行之間的行
#x,y!:查詢不包括x和y行號的行;
c、編輯命令
#p:打印匹配行;=:打印文件行號;a\:在定位行之後追加文本;
#i\:在定位行之前追加文本;
#d:刪除定位行;c\:用新文本替換定位的文本;s:使用替換模式替換相應模式
#r:從另一個文件讀取文本;w:將文件寫入到文件;y:變換字符;
#q:第一個模式匹配之後就退出;
#1:顯示與八進制ascii碼等價控制字符;{}:在定位行執行的命令組;
#n:讀取下一個輸入行,用下一個命令處理新的行
d、例子
#打印第1行,並且打印/不打印文件所有行
sed '1p' a.txt
sed -n '1p' a.txt
#打印第2行到第4行
sed -n '2,4p' bkname.txt
#打印不在第2到第4行的行
sed -n '2,4!p' bkname.txt
#定位行前1行追加文本
sed '/NAME5/i\Add_string" bkname.txt
#定位行後1行追加文本
sed '/NAME5/a\add_string' bkname.txt
#使用正則表達式需要使用s選項
#同1行定位字符串前面追加文本
sed 's/name5/addstring&/' bkname.txt
#同1行定位字符串後面追加文本
sed 's/name5/&addstring/' bkname.txt
#修改定位文本
#將NAME5替換成rp_string
#將NAME5定位行整行替換成rp_string
sed '/NAME5/c\rp_string' bkname.txt
#刪除文本,分別刪除第6行,第2行到第5行
sed '6d' bkname.txt
sed '2,5d' bkname.txt
#刪除不在第2到第9行的行,實際就是顯示第2到第9行
sed '2,9!d' bkname.txt
#參數p和g區別,p:球只替換第1次出現匹配的文本;
#g:表示替換所有出現的匹配的文本
#sed是按行來處理的,所以要刪除1行中多次出現匹配文本的話,需要使用g,注意兩者區別
sed -n 's/name/*/p' bkname.txt
sed -n 's/name/*/g' bkname.txt
#字符變換,一一對應替換
#a替換成E,b替換成F,c替換成G,d替換成H
sed 'y/abcd/EFGH/' bkname.txt
#元字符匹配,定位到最後1行
sed -n '$p' bkname.txt
sed -n '$'p bkname.txt
#定位以test結尾的行
sed -n '/test$/p' bkname.txt
#定位行到指定行,如果指定行數值>定位行數值,則會打印
#指定行到最後1行,如指定行8>4(name4所在行數值)
sed -n '3,/name4/p' bkname.txt
sed -n '8,/name4/p' bkname.txt
#等價於
sed -n '8,$p' bkname.txt
#定位行到指定行,如果指定行數值>定位行數值,則只會打印定位行
sed -n '/name4/,6p' bkname.txt
sed -n '/name4/,2p' bkname.txt
#"!"歎號:表示非,顯示不在第2到第9行的行
#=:只打印行號
sed -n '/name4/=' bkname.txt
#l(小寫L):顯示控制符
sed -n '1,$l' bkname.txt
#-e:使用多個編輯命令
sed -n '/name4/{p;=}' bkname.txt
sed -n -e '/name4/p' -e '/name4/=' bkname.txt
#n:處理定位行的下一行,對定位行的下1行的"00"替換成"*"
sed '/name1/{n;s/00/*/g;}' bkname.txt
#打印定位行的下一行
sed -n '/name2/{n;p}' bkname.txt
#在定位行執行命令組,注意是對定位行操作
sed '/name1/{s/100/*/g;s/name/ttt/g;}' bkname.txt