• Shell三剑客之sed命令


    Sed简介

    Sed是Stream Editor(流编辑器)缩写,是操作、过滤和转换文本内容的强大工具,常用功能有增删改查。

    Sed命令执行流程

    Sed语法格式

    Sed [option] ‘[匹配][处理]’ [file]

    说明:个人将语法中sed命令部分分为先匹配后处理两个部分。Sed可以接文件,也可以接标准输入,比如管道等。

    查看Sed版本

    [root@web01 mnt]# sed --version
    GNU sed version 4.2.1
    

    统一实验文本

    [root@web01 sed]# cat >> person.txt << EOF
    > 101,peterwang,CEO
    > 102,zhangyao,CTO
    > 103,Alex,COO
    > 104,yy,CFO
    > 105,feixue,CIO
    > EOF
    

    单行增加

    [root@web01 sed]# sed '2a 106,dandan,CSO' person.txt
    101,peterwang,CEO
    102,zhangyao,CTO
    106,dandan,CSO               // a 追加文本到指定行后
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '2i 106,dandan,CSO' person.txt
    101,peterwang,CEO
    106,dandan,CSO                 // i 插入文本到指定行前
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

    多行增加

    [root@web01 sed]# sed '2a 106,dandan,CSO
    107,bingbing,CCO' person.txt
    101,peterwang,CEO
    102,zhangyao,CTO
    106,dandan,CSO
    107,bingbing,CCO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '2a 106,dandan,CSO
    > 107,bingbing,CCO' person.txt
    101,peterwang,CEO
    102,zhangyao,CTO
    106,dandan,CSO
    107,bingbing,CCO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

    匹配:指定执行的行范围

    Sed可以对特定的行进行处理,如果不指定那么sed默认匹配所有行。

    用法:n1[,n2]{sed-commands}  地址用逗号分割,可以是数字、正则或二者的组合。

    举例:

    1. 10{sed-commands}   对第10行操作
    2. 10,20{sed-commands}   对10-20行进行操作,包括第10,20行
    3. 10,+20{sed-commands}  对10-30行进行操作(从第十行开始向后20行),包括第10,30行
    4. 1~2{sed-commands}      对 1,3,5,7…行进行操作(~2表示间隔为2)
    5. 10,${sed-commands}     对10到最后一行进行操作($代表最后一行),包括第10行
    6. /peter/{sed-commands}   匹配peter所在的行进行操作
    7. /peter/,/Alex/{sed-commands}  对peter所在行到Alex所在行进行操作
    8. /peter/,10{sed-commands}   对peter所在行到第10行进行操作
    9. 1,/Alex/{sed-commands}  对第1行到Alex所在行进行操作
    10. /peter/,+2{sed-commands}   对peter所在行到其后2行进行操作

    删(d)

    [root@web01 sed]# sed '2d' person.txt 
    101,peterwang,CEO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '2,5d' person.txt 
    101,peterwang,CEO
    
    [root@web01 sed]# sed '2,$d' person.txt 
    101,peterwang,CEO
    
    [root@web01 sed]# sed '1~2d' person.txt 
    102,zhangyao,CTO
    104,yy,CFO
    
    [root@web01 sed]# sed '1,+2d' person.txt 
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '/peter/d' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '/peter/,/Alex/d' person.txt 
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed '/peter/,3d' person.txt 
    104,yy,CFO
    105,feixue,CIO
    

    整行替换(c)

    [root@web01 sed]# sed '2c 106,dandan,CSO' person.txt 
    101,peterwang,CEO
    106,dandan,CSO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

    部分替换(s)

    基本格式: sed ‘s#匹配文本#替换文本#g’   sed –i  ‘s#匹配文本#替换文本#g’

    1. s 是sed命令,表示替换;
    2. g 是命令s的替换标记,表示对该行全局替换,不加g则只替换每一行匹配到的第一个文本;
    3. # 是定界符,可以是/ # @等任意字符,习惯上用 #;
    4. 匹配文本可以用正则表达式,替换文本不能。
    5. - i 是sed的一个选项,表示对文件进行修改,通常不加i时,sed只是对内存模式空间里的数据进行操作,不修改磁盘中的源文件。
    [root@web01 sed]# sed 's#zhangyao#peter#g' person.txt 
    101,peterwang,CEO
    102,peter,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    
    [root@web01 sed]# sed -i 's#zhangyao#peter#g' person.txt 
    [root@web01 sed]# cat person.txt 
    101,peterwang,CEO
    102,peter,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    

    变量替换

    #支持使用变量表示数据
    [root@web01 sed]# cat >> test.txt << EOF > a > b > a > EOF [root@web01 sed]# x=a [root@web01 sed]# y=b [root@web01 sed]# echo $x $y a b [root@web01 sed]# sed 's#'$x'#'$y'#g' test.txt b b b

    分组替换

    基本格式

    #分组替换常用于取某一行里的动态数据
    [root@web01 sed]# echo "I am Linux student" | sed -r 's#^.*am (.*) stu.*$#1#g' Linux // 1 表示的是前面()里的内容 -r 表示使用扩展正则

     案例:取IP地址

    [root@web01 sed]# ifconfig eth0            // 取出10.0.0.8
    eth0      Link encap:Ethernet  HWaddr 00:0C:29:1D:68:4B  
              inet addr:10.0.0.8  Bcast:10.0.0.255  Mask:255.255.255.0
              inet6 addr: fe80::20c:29ff:fe1d:684b/64 Scope:Link
              UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
              RX packets:10434 errors:0 dropped:0 overruns:0 frame:0
              TX packets:7185 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:4253413 (4.0 MiB)  TX bytes:742419 (725.0 KiB)
    
    [root@web01 sed]# ifconfig eth0 | sed -nr 's#^.*dr:(.*)  Bc.*$#1#gp'
    10.0.0.8
    [root@web01 sed]# ifconfig eth0 | awk -F "[ :]+" 'NR==2{print $4}'  // 推荐
    10.0.0.8
    [root@web01 sed]# grep "IPADDR" /etc/sysconfig/network-scripts/ifcfg-eth0 | cut -d = -f 2
    10.0.0.8
    

    按行查询

    [root@web01 sed]# sed -n '2p' person.txt   // -n 是sed 选项,表示取消默认输出
    102,zhangyao,CTO
    
    [root@web01 sed]# sed -n '2,3p' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    

    按字符串查询

    [root@web01 sed]# sed -n '/CTO/p' person.txt 
    102,zhangyao,CTO
    
    [root@web01 sed]# sed -n '/CTO/,/CFO/p' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    

    混合查询

    [root@web01 sed]# sed -n '2,/CFO/p' person.txt 
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    

    特殊用法

    -i选项修改前备份,-i后面可以接后缀,这样sed就会先备份再修改

    [root@web01 sed]# cat person.txt 
    101,peterwang,CEO
    102,zhangyao,CTO
    103,Alex,COO
    104,yy,CFO
    105,feixue,CIO
    [root@web01 sed]# sed -i.bak '2s#zhangyao# #g' person.txt 
    [root@web01 sed]# ls
    person.txt  person.txt.bak  test.txt
    [root@web01 sed]# head -2 person.txt
    101,peterwang,CEO
    102, ,CTO
    [root@web01 sed]# head -2 person.txt.bak 
    101,peterwang,CEO
    102,zhangyao,CTO
    

     只对匹配到的第一行进行操作

    比如我们要修改nginx端口
    #第一种方法会匹配所有包含listen的行然后将80替换为8080
    sed -i '/listen/{s/80/8080/}' nginx.conf.default   
    #第二种方法指定了一个范围,替换范围种所有的80为8080,但如果我们确定该范围内只有listen关键字行包含80,实际上这就相当于只对匹配到的第一个listen行进行端口替换
    sed -i '0,/listen/{s/80/8080/}' nginx.conf.default
    

      

  • 相关阅读:
    sql总结
    2018年6月10日笔记
    Docker入门之zabbix-agent篇
    2018年6月7日笔记
    2018年6月5日笔记
    Docker入门之container篇
    Docker入门之image篇
    Docker 入门
    2018年5月31日笔记
    2018年5月29日笔记
  • 原文地址:https://www.cnblogs.com/Peter2014/p/7552137.html
Copyright © 2020-2023  润新知