shell腳本(五)

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

wKioL1V34cDBnX9SAAC39XNVfpE680.jpg

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