美文网首页
18 - shell使用sed修改配置

18 - shell使用sed修改配置

作者: 舍是境界 | 来源:发表于2022-03-30 07:25 被阅读0次

    常用sed指令

    • p(print):打印行
    • d(delete):删除行
    • c(replace):替换行
    • s(substitution):替换关键词
    • =:打印行号

    过滤数据

    • print指令
    sed -n '/IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-enp0s3
    IPADDR=192.168.0.125
    
    free | sed -n '/Mem/p'
    Mem:        3880248      313344     3312696        8776      254208     3344464
    
    df -h | sed -n '/\/$/p' #过滤磁盘根分区信息(根分区是以/结尾的分区)
    /dev/mapper/centos-root   26G  6.0G   20G  24% /
    
    sed -n '1p;3p;6p' /etc/passwd #显示第1,3,6行内容
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    
    sed -n '2!p' /etc/hosts #打印第2行以外的所有其他行内容
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    

    删除数据

    • delete指令(不使用-i选项,源文件不会被修改)
    sed 'd' /etc/hosts #删除全文,没有定位条件等于匹配所有
    
    cat /etc/fstab > fstab
    sed '1,3d' fstab #1到3行都删除
    
    sed '/dev/!d' fstab #不包含dev的行都删除
    
    sed '/^#/d' fstab #删除所有以#符号开头的行
    sed '/^$/d' fstab #删除所有空白行
    

    替换行

    • replace指令(不使用-i选项,源文件不会被修改)
    sed 'c 123456' fstab #所有行被替换为123456
    
    file=/etc/sysconfig/network-scripts/ifcfg-enp0s3
    sed 'IPADDR/c IPADDR=1.1.1.1' $file #替换ip地址
    
    sed '/127/c 127.0.0.1 localhost' /etc/hosts
    sed '4c xxxx' /etc/shells #第四行替换为xxxx
    

    替换关键词

    • substitution指令(不使用-i选项,源文件不会被修改)
    cat test.txt
    2046 2048 2046 2046
    1001 2046 2999 1888
    2046 2046 2046 20462046 2048 2046 2046
    1001 2046 2999 1888
    2046 2046 2046 2046
    
    sed 's/2046/XXXX/' test.txt #替换第一个词
    XXXX 2048 2046 2046
    1001 XXXX 2999 1888
    XXXX 2046 2046 20462046 2048 2046 2046
    1001 XXXX 2999 1888
    XXXX 2046 2046 2046
    
    sed 's/2046/XXXX/g' test.txt #替换所有的词
    XXXX 2048 XXXX XXXX
    1001 XXXX 2999 1888
    XXXX XXXX XXXX XXXXXXXX 2048 XXXX XXXX
    1001 XXXX 2999 1888
    XXXX XXXX XXXX XXXX
    
    sed 's/2046/XXXX/2' test.txt #替换第二个
    2046 2048 XXXX 2046
    1001 2046 2999 1888
    2046 XXXX 2046 20462046 2048 2046 2046
    1001 2046 2999 1888
    2046 XXXX 2046 2046
    
    sed 's/2046/(&)/g' test.txt
    (2046) 2048 (2046) (2046)
    1001 (2046) 2999 1888
    (2046) (2046) (2046) (2046)(2046) 2048 (2046) (2046)
    1001 (2046) 2999 1888
    (2046) (2046) (2046) (2046)
    
    sed '2s/2046/XXXX/g' test.txt #替换第二行
    2046 2048 2046 2046
    1001 XXXX 2999 1888
    2046 2046 2046 20462046 2048 2046 2046
    1001 2046 2999 1888
    2046 2046 2046 2046
    
    sed '2s/2046//g' test.txt
    sed '2s/2046/XXXX/p' test.txt #替换后输出
    2046 2048 2046 2046
    1001 XXXX 2999 1888
    1001 XXXX 2999 1888
    2046 2046 2046 20462046 2048 2046 2046
    1001 2046 2999 1888
    2046 2046 2046 2046
    
    • 替换符号:/ 可以使用其他字符
    sed 's#2046#(&)#g' test.txt
    (2046) 2048 (2046) (2046)
    1001 (2046) 2999 1888
    (2046) (2046) (2046) (2046)(2046) 2048 (2046) (2046)
    1001 (2046) 2999 1888
    (2046) (2046) (2046) (2046)
    
    • 正则符号()具有保留功能
    echo "hello the world" | sed -r 's/^(.)(.*)(.)$/\3\2\1/'
    dello the worlh
    

    匹配1:^号开头,任意字符开头(一个),(.) 匹配到h
    匹配2:.*代表任意长度的任意字符,匹配到ello the worl(如后续无其他内容,则能匹配到d,这里只能不能)
    匹配3:(.) 一定能匹配到一个字符,即:d
    结果:用3和1交换位置,即为:dello the worlh

    打印行号

    • =
     sed -n '1=' /etc/passwd
    sed -n '/root/=' /etc/passwd
    1
    10
    sed -n '/bash$/=' /etc/passwd
    1
    19
    sed -n '$=' /etc/passwd #统计行号
    19
    wc -l /etc/passwd
    19 /etc/passwd
    

    小结

    • 本文我们学习了sed的打印、删除、行替换、关键词替换、显示行号等指令

    相关文章

      网友评论

          本文标题:18 - shell使用sed修改配置

          本文链接:https://www.haomeiwen.com/subject/enqxjrtx.html