• sed


    流编辑器,以行为单位;

    # sed --help      
    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 ext:在行前面插入文本"text",支持使用 实现多行插入;

    # sed '3 i 
    ew line' /etc/fstab      在第三行前面插入new line
    # sed '3 i 
    ew line
    another new line' /etc/fstab
    

    a ext:在行后面追加文本"text",支持使用 实现多行追加;

    # sed '3 a 
    ew line' /etc/fstab        在第三行后面插入new line
    # sed '/UUID/ a 
    ew line' /etc/fstab   在包含UUID的行后面插入new line
    

    c ext:把匹配到的行替换为此处指定的文本"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:]]@
    @g' /etc/init.d/functions | sort | uniq -c | sort -n 
    
  • 相关阅读:
    idea 快捷键 记录
    Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms") 使用@ConfigurationProperties读取yml配置
    SpringData Jdbc
    设备树中指定的中断触发方式与request_irq中指定的触发方式不一致时,内核会使用哪种中断触发方式呢?
    设备树中的interrupts属性解析
    编译grub时报告"grub_script.yy.c:19:22: error: statement with no effect [-Werror=unused-value]"怎么处理?
    uefi是如何启动linux内核的?
    markdown中如何设置字体为红色?
    linux下如何查看磁盘分区所使用的文件系统格式?
    bootargs中的rootwait 与rootdelay有什么区别?
  • 原文地址:https://www.cnblogs.com/keithtt/p/6819398.html
Copyright © 2020-2023  润新知