huiselele 发表于 2018-8-25 12:17:29

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


页: [1]
查看完整版本: shell脚本(五)