设为首页 收藏本站
查看: 568|回复: 0

shell编程之sed

[复制链接]

尚未签到

发表于 2018-8-23 12:05:25 | 显示全部楼层 |阅读模式
  sed命令
  文本处理三剑客:
  grep,egrep,fgrep:文本过滤器
  sed:流编辑器,以行为单位
  awk:文本格式化工具,报告生成器
  sed [OPTION]... {script-only-if-no-other-script} [file]...
  常用选项:
  -n:不打印没关系的行;不输出模式空间的内容至屏幕;
  -e:多点编辑;连接多个命令同时处理;也可以用分号";"隔开
  -f:指定脚本文件,并将脚本应用到文件;
  脚本文件的内容,每行一个命令;
  cat sed.rules
  s/this/THAT/g
  /^$/d
  sed -f sed.rules sed.text
  -r:支持使用扩展正则表达式;
  -i:直接修改原文件;可以用-i.bak参数备份原文件;
  sed –i.bak ‘s/dog/cat/g’ pets
  地址定界:
  (1)不给地址:对全文进行处理;
  (2)单地址:
  #:指定第几行;
  /PATTERN/:被此模式匹配到的每一行;
  (3)    地址范围:
  #,#:第几行到第几行;
  #,+#:第几行到+#行;
  #,/PAT1/:第几行到第一次匹配到PAT1的行;
  /PAT1/,/PAT2/:第一次匹配到PAT1的行到第一次匹配到PAT2的行;
  $:最后一行;
  (4)步进:~
  1~2:所有奇数行;
  2~1:所有偶数行;
  编辑命令:
  d:删除
  sed '1,5d' /etc/fstab
  p:打印,必须使用-n参数;
  ifconfig | sed -n '2p' 显示第二行
  sed '1~2p' /etc/fstab 奇数行会显示2次
  sed -n '1~2p' /etc/fstab 只显示奇数行
  sed '1~2d' /etc/fstab 显示偶数行
  i\text:在行前面插入文本"text",支持使用\n实现多行插入;
  sed '3 i \new line' /etc/fstab 在第三行前面插入new line
  sed '3 i \new line\nanother new line' /etc/fstab
  a\text:在行后面追加文本"text",支持使用\n实现多行追加;
  sed '3 a \new line' /etc/fstab 在第三行后面插入new line
  sed '/UUID/ a \new line' /etc/fstab 在包含UUID的行后面插入new line
  c\text:把匹配到的行替换为此处指定的文本"text",注意是整行替换;
  w:保存匹配到的结果到指定位置;
  sed -n '/^[^#]/p' /etc/fstab
  sed '/^[^#]/w /tmp/fstab.new' /etc/fstab
  r:从其它文件读取文本,并插入匹配行之后;文件合并;
  sed '3 r /etc/issue' /etc/fstab
  =:为匹配到的行打印行号;
  sed '/^UUID/=' /etc/fstab
  !:条件取反;
  sed '/^[^#]/d' /etc/fstab 删除非#开头的行
  sed '/^#/!d' /etc/fstab 删除非#开头的行
  sed '5!d' /etc/fstab 只保留第5行(处理未匹配到的行)
  s///:查找替换,其分隔符可自行指定,常用的有s@@@,s###等;
  默认情况只替换第一次匹配到的内容;
  sed 's/line/LINE'
  要想每行最多匹配2个,可使用/2
  sed 's/line/LINE/2'
  替换标记:
  g:全局替换;
  p:显示替换成功的行;
  w:将替换成功的结果保存至指定文件中;
  &:引用前面搜索到的整个内容;
  查找替换命令为/tmp/functions文件的每个以空白字符开头的行的行首加上#;
  :%s@^[[:space:]]@#&@g
  \(\):后向引用,引用分组;如s/\(love\)able/\1r,loveable替换成lovers;
  练习:
  1、删除/etc/prelink.conf.d/grub2.conf文件中所有以空白字符开头的行的行首的空白字符;
  sed 's@^[[:space:]]\+@@' /etc/prelink.conf.d/grub2.conf
  2、删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符;
  sed 's@^#[[:space:]]*@@' /etc/fstab
  3、输出一个绝对路径给sed,取出其目录;
  echo "/var/log/messages" | sed 's@[^/]\+$@@'
  echo "/var/log/messages" | sed -r 's@[^/]+$@@'
  4、在/root/install.log每一行行首增加#号;
  sed 's@^.*@#&@' /root/install.log
  sed 's@^@#@' /root/install.log
  5、在/etc/fstab文件中不以#开头的行的行首增加#号;
  sed '/^#/!s@.*@#&@' /etc/fstab    (处理未匹配到的行)
  sed '/^#/!s@^@#@' /etc/fstab
  6、处理/etc/fstab路径,使用sed命令取出其目录名和基名;
  echo "/etc/fstab" | sed 's@[^/]\+$@@'
  echo "/etc/fstab" | sed 's@^.*[/]@@'
  7、利用sed取出ifconfig命令中本机的IPv4地址;
  ifconfig | sed -n '2p' | tr -s " " | cut -d" " -f3
  8、    过滤出/media/cdrom/Packages目录下rpm包的架构字段,并统计每种架构的个数;
  ls *.rpm | sed 's@.*\.\(.*\)\.rpm@\1@' | sort | uniq -c
  ls *.rpm | sed -r 's@.*\.(.*)\.rpm@\1@' | sort | uniq -c
  ls *.rpm | sed -r 's@.*\.(.*)\..*@\1@' | sort | uniq -c
  ls *.rpm | rev | cut -d. -f2 | rev | sort | uniq -c
  rev:reverse lines of a file or files.把每一行反序显示;
  9、统计一个文件里面哪个单词重复的次数最多;
  egrep -o "[[:alpha:]]+" /etc/init.d/functions | sort | uniq -c | sort -n
  sed 's@[^[:alpha:]]@\n@g' /etc/init.d/functions | sort | uniq -c | sort -n
  高级编辑命令:
  h:把模式空间中的内容覆盖至保持空间中;
  H:把模式空间中的内容追加至保持空间中;
  g:把保持空间中的内容覆盖至模式空间中;
  G:把保持空间中的内容追加至模式空间中;
  x:把模式空间中的内容与保持空间中的内容互换;
  n:覆盖读取匹配到的行的下一行至模式空间中;读取下一个输入行,用下一个命令处理新的行;
  N:追加读取匹配到的行的下一行至模式空间中;
  d:删除模式空间中的行;
  D:删除多行模式空间中的所有行;
  示例:
  sed -n 'n;p' file:显示偶数行;
  sed '1!G;h;$!d' file:逆序显示文件内容;
  sed '$!d' file:取出最后一行;
  sed '$!N;$!D' file:取出后两行;
  sed '/^$/d;G' /etc/fstab:删除原有的所有空白行,而后为所有的非空白行后添加一个空白行;
  sed 'n;d' file:显示奇数行;
  sed 'G' file:在原有的每行后方添加一个空白行;
  sed -n '1!G;h;$p' file:逆序显示文件内容;


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-555529-1-1.html 上篇帖子: shell kill 进程 下篇帖子: TCSH shell 编程入门
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表