標籤: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
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/46/wKiom1V33VTRKyADAADqfpYLAag962.jpg" />
#列印第2行到第4行
sed -n ‘2,4p‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/42/wKioL1V33vniNyHeAAEN19zWcN8690.jpg" />
#列印不在第2到第4行的行
sed -n ‘2,4!p‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/46/wKiom1V33VTB7RgaAAEoB3ZE1q8215.jpg" />
#定位行前1行追加文本
sed ‘/NAME5/i\Add_string" bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/42/wKioL1V33vrSXR5oAADTsThS5Ms598.jpg" />
#定位行後1行追加文本
sed ‘/NAME5/a\add_string‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/46/wKiom1V33VXiPupYAACu9JMJjbY957.jpg" />
#使用Regex需要使用s選項
#同1行定位字串前面追加文本
sed ‘s/name5/addstring&/‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/42/wKioL1V33vvi_uWrAACkSx90f2Y614.jpg" />
#同1行定位字串後面追加文本
sed ‘s/name5/&addstring/‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/42/wKioL1V33vugZJrRAAChIsOeKVs817.jpg" />
#修改定位文本
#將NAME5替換成rp_string
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/46/wKiom1V33VbyII_0AACDp3luL0I277.jpg" />
#將NAME5定位行整行替換成rp_string
sed ‘/NAME5/c\rp_string‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/42/wKioL1V33vzAe7iDAAB-yg0aoXE041.jpg" />
#刪除文本,分別刪除第6行,第2行到第5行
sed ‘6d‘ bkname.txt
sed ‘2,5d‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/42/wKioL1V33vyhOuWbAADBCxhuWDs254.jpg" />
#刪除不在第2到第9行的行,實際就是顯示第2到第9行
sed ‘2,9!d‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/46/wKiom1V33VfRepTmAACbVw4Mk0M151.jpg" />
#參數p和g區別,p:球只替換第1次出現匹配的文本;
#g:表示替換所有出現的匹配的文本
#sed是按行來處理的,所以要刪除1行中多次出現匹配文本的話,需要使用g,注意兩者區別
sed -n ‘s/name/*/p‘ bkname.txt
sed -n ‘s/name/*/g‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/42/wKioL1V33vygtmLtAADMp-Oz4S0032.jpg" />
#字元變換,一一對應替換
#a替換成E,b替換成F,c替換成G,d替換成H
sed ‘y/abcd/EFGH/‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/46/wKiom1V33VjD_l3ZAABdEXOG6_k671.jpg" />
#元字元匹配,定位到最後1行
sed -n ‘$p‘ bkname.txt
sed -n ‘$‘p bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/46/wKiom1V33VjBspAtAABTHX0Fg8U363.jpg" />
#定位以test結尾的行
sed -n ‘/test$/p‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/42/wKioL1V33v3zIQm2AABPHrKKYc4624.jpg" />
#定位行到指定行,如果指定行數值>定位行數值,則會列印
#指定行到最後1行,如指定行8>4(name4所在行數值)
sed -n ‘3,/name4/p‘ bkname.txt
sed -n ‘8,/name4/p‘ bkname.txt
#等價於
sed -n ‘8,$p‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/42/wKioL1V33v7AedRVAAEOf7h07YE981.jpg" />
#定位行到指定行,如果指定行數值>定位行數值,則只會列印定位行
sed -n ‘/name4/,6p‘ bkname.txt
sed -n ‘/name4/,2p‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/46/wKiom1V33VmDhZxQAACbUSf1xMs763.jpg" />
#"!"歎號:表示非,顯示不在第2到第9行的行
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/42/wKioL1V33v7y0sGoAABxxat2olg910.jpg" />
#=:只列印行號
sed -n ‘/name4/=‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/46/wKiom1V33VnhKL3rAAB6XXXUQKc687.jpg" />
#l(小寫L):顯示控制符
sed -n ‘1,$l‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6E/46/wKiom1V33VnTMQ3FAADXy3UPRyE639.jpg" />
#-e:使用多個編輯命令
sed -n ‘/name4/{p;=}‘ bkname.txt
sed -n -e ‘/name4/p‘ -e ‘/name4/=‘ bkname.txt650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/42/wKioL1V33v6jn9KHAACRBx76xkc695.jpg" />
#n:處理定位行的下一行,對定位行的下1行的"00"替換成"*"
sed ‘/name1/{n;s/00/*/g;}‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/46/wKiom1V33VniibCXAADSHdr9f6M513.jpg" />
#列印定位行的下一行
sed -n ‘/name2/{n;p}‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/6E/42/wKioL1V33v6TSAzJAABSoPwGKDE335.jpg" />
#在定位行執行命令組,注意是對定位行操作
sed ‘/name1/{s/100/*/g;s/name/ttt/g;}‘ bkname.txt
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/6E/43/wKioL1V34cDBnX9SAAC39XNVfpE680.jpg" title="shell.png" alt="wKioL1V34cDBnX9SAAC39XNVfpE680.jpg" />
本文出自 “愛就行動” 部落格,請務必保留此出處http://1055745601.blog.51cto.com/5003160/1660411
shell指令碼(五)