• sed 命令详解


    sed 正则表达式特点
    1)sed 文本工具支持:BREs、EREs
      sed 指令默认是使用"BREs"
      sed 命令参数 “-r ” ,则表示要使用“EREs"
    2)sed 功能与作用
      a. sed 处理的对象:文本文件
      b. sed 处理操作:对文本文件的内容进行 --- 查找、替换、删除、增加等操作
      c. sed 在处理文本文件的时候,也是按行处理的
    sed 格式:sed 选项 '位置命令(哪些位置做什么操作)' 读入的文件

    常用选项:
      -n 不输出模式空间内容到屏幕,即不自动打印
      -e 多点编辑
      -r 支持使用扩展正则表达式
      -i.bak 备份文件并原处编辑

           -i 不备份文件并修改

    位置定界:
      (1) 不给地址:对全文进行处理
      (2) 单地址:
        #:指定的行,$:最后一行
        /pattern/:被此处模式所能够匹配到的每一行
      (3) 地址范围:
        #,#
        #,+#
        /pat1/,/pat2/
        #,/pat1/
    编辑命令:
      d 删除模式空间匹配的行,并立即启用下一轮循环
      p 打印当前模式空间内容,追加到默认输出之后
      a []text 在指定行的下一行追加文本,支持使用 实现多行追加
      i []text 在指定行的上一行插入文本
      c []text 替换行为单行或多行文本
      w /path/file 保存模式匹配的行至指定文件
      r /path/file 读取指定文件的文本至模式空间中匹配到的行后
      = 为模式空间中的行打印行号
      ! 模式空间中匹配行取反处理


    sed工具还有一个专门用于搜索替换的 (可以不用位置直接使用,也可以在指定位置后面,当做命令使用)
      格式:s/// 查找替换,支持使用其它分隔符,s@@@,s###
      替换标记:
        g 行内全局替换
        p 显示替换成功的行
        w /PATH/FILE 将替换成功的行保存至文件中

    sed 工作原理,每次读取文本中的一行,也是逐行处理,将读取的一行放到“模式空间”,进行处理,比如查看,打印,修改等,然后就在“模式空间”把这一行删掉,然后再加载下面一行。在模式空间中,默认的不需要做什么操作,就会自动把这一行打印出来。相当于模式空间中内置了 print操作。
      sed 格式:sed 选项 '位置命令(哪些位置做什么操作)' 读入的文件
        sed '' /etc/passwd //没有选项,没有位置,默认就是全文,没有操作,默认就是打印的操作。所以就会把/etc/passwd 文件内容全部打印出来
        sed 支持管道的,也就是可以把命令的执行结果传给sed。 ifconfig eth0 | sed -n '2p' //位置2,操作是p。打印第二行
        位置格式除了,固定的位置,也可以使用正则表达式来匹配相应的位置 sed -n '/^U/p' /etc/fstab // 以U开头的行,打印

      位置也可以使用一个地址范围,比如 从第几行到第几行,从第几行往后几行,从一个模式到另一个模式中间的几行,从第几行到符合模式的行的中间
      seq 10 | sed -n '3,5p' ///打印第三行到第五行的内容。

    例子

    sed -n '/^b/,/^f/p' //-n 关闭自动打印,显示b开头 与f开头之间的行 面试题,找出几点几分到几点几分的日志信息

    sed '/^#/d' /etc/fstab //位置是以#号开头的行,操作是d删除。 以#开头的行 不显示 ,这些只是显示结果,不会改变文件的内容
    sed '/^#/d' /etc/fstab |sed '/^$/d' //不显示#号开头的行,并且不显示空行
    sed '/^#/d;/^$/d' /etc/fstab //使用两个正则表达式条件,不显示#号开头的行,并且不显示空行
    seq 10 | sed -n '1~2p' //步进 1~2 奇数行 2~2 偶数行
    sed -n '2p' sed -n '$p'
    sed 10|sed '1~2a line' //位置是1~2,操作是a line 表示在匹配的行的下一行追加line
    sed -i.bak '/^root/a line firename' //在 root开头的行的下一行追加一行firename -i 会把修改的内容写到文件里。 -i.bak 是先把文件备份成.bak后缀,然后再修改源文件
    sed -i.bak '/^Listen/a listen 8080' /etc/httpd/conf/httpd.conf //先把httpd.conf 备份成.bak文件,然后再源文件的Listen开头的行,下一行添加listen 8080
    sed -i.bak '/^Listen/i listen 8080' /etc/httpd/conf/httpd.conf //操作i 是在匹配行的上一行添加


    sed -i.bak '/^Listen/i listen 8080' /etc/httpd/conf/httpd.conf //添加的前面有空格
    sed -i.bak '/^Listen/c listen 8080' /etc/httpd/conf/httpd.conf //操作c 是替换
    sed '/^SELINUX=/c SELINUX=disabled' /etc/selinux/config /// 位置是‘SELINUX=’开头的行,操作是c 替换成SELINUX=disabled 搜索出的这一行 替换掉
    sed '/^#/d;w /data/httpd.conf' /etc/httpd/conf/httpd.conf ///位置是#开头的行,操作是d;w 先删掉,然后再另存为/data/httpd.conf 把#号开头的行删掉,然后另存为
    sed 's/root/ROOT/g' passwd //搜索替换,把root替换成ROOT,不加g的话默认只替换第一个,g是全部的意思,搜索出来的全部替换成
    sed -i.bak 's/^[0-9]+$/this is tihuan!!/g' cattest.txt ///使用搜索替换和操作c效果一样
    sed -i.bak '/^[0-9]+$/c this is tihuan!!' cattest.txt ///使用搜索替换和操作c效果一样
    sed -i.bak '/^root/,/^<root/s/#//g' list.txt //////找到 root与<root 之间的位置 做全局的搜索替代g,把#都删掉了,然后保存到了源文件中
    sed -n '/#<VirtualHost/,/#</VirtualHost/s@#@@p' /etc/httpd/conf/httpd.conf //找到这个节点,做搜索替换,把#删掉


    [root@centos7 data]#ifconfig eth0|sed -n '2s/^.*inet //;s@ netmask.*$@@p' ///对于第二行 做搜索替代,然后p打印
    [root@centos6 data]#ifconfig eth0 | sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*$)/2/p' ///分组替代
    [root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@1@' ///分组替代
    /etc/sysconfig/
    [root@centos6 data]#echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@2@' ///分组替代
    network-scripts


    sed -rn '/^[[:space:]+linux16]/s#(.*)#1 我想假加的字符串 #p' /boot/grub2/grub.cfg //找到linux16的行,在行的最后面加上你想要的东西
    sed -rn '/^[[:space:]+linux16]/s#(.*)#1 net.ifnames=0 #p' /boot/grub2/grub.cfg //这个命令会把网卡名字改为传统的网卡 eth1.。。。

    [root@centos7 data]#sed 's/'''$var'''/wang/' passwd ///使用变量 '''


    sed -rn '/rhgb quiet/s#(.*)(rhgb quiet)("$)#12 int int 3#p' /etc/default/grub

    [root@centos7 Packages]#ls *.rpm|sed -r 's/.*.(.*).rpm$/1/'|sort|uniq -c //查看rpm前面的架构都有哪几种 分别的个数
      2258 i686
      3122 noarch
      4639 x86_64
    [root@centos7 Packages]#ls *.rpm|rev|cut -d. -f2|rev|sort |uniq -c
      2258 i686
      3122 noarch
      4639 x86_64

    要有多努力才能对得起奔波的脚步和身上的期望
  • 相关阅读:
    SQL Server存储过程(二)
    WPF 小知识 (设置背景图)
    关于SQL Server中索引使用及维护简介
    学习asp.net比较完整的流程(转)
    web开发常用默认端口
    接口和类的几大区别
    WEB建站规划之建站目的
    个人经验:页面无刷新传输数据的多种方法总结
    旅游电子商务探讨
    vs2008中文版提供下载(包含中文msdn)
  • 原文地址:https://www.cnblogs.com/hxfcodelife/p/13442894.html
Copyright © 2020-2023  润新知