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

你可能感兴趣的:(shell脚本(五))