• sed练习


    [root@node2 scprits]# cat > data << eof
    > This is the header line
    > This is the first data line
    > This is the secong data line
    > This is the last line
    > eof

    打印文件第二行,第二行会打印两遍,sed默认会打印文件中的所有行。

    [root@node2 scprits]# sed '2p' data
    This is the header line
    This is the first data line
    This is the first data line
    This is the secong data line
    This is the last line
    [root@node2 scprits]# sed -n '2p' data
    This is the first data line

    用-n选项则只打印匹配到的行。

    [root@node2 scprits]# sed -n '1,3p' data
    This is the header line
    This is the first data line
    This is the secong data line
    打印1到3行
    [root@node2 scprits]# sed -n '/secong/p' data
    This is the secong data line
    打印包含secong的所有行
    [root@node2 scprits]# sed -n '/first/,4p' data
    This is the first data line
    This is the secong data line
    This is the last line
    打印匹配first的行到第4行
    [root@node2 scprits]# sed -n '2,/last/p' data
    This is the first data line
    This is the secong data line
    This is the last line
    打印第2行到匹配到的last行
    [root@node2 scprits]# sed -n '/header/,/last/p' data
    This is the header line
    This is the first data line
    This is the secong data line
    This is the last line
    打印匹配到的header行到匹配到的last行的中间所有行
    [root@node2 scprits]# sed -n '1,4{=;p}' data
    1
    This is the header line
    2
    This is the first data line
    3
    This is the secong data line
    4
    This is the last line
    打印文件中的第一行到第四行的内容,且打印行号,当用到sed不同的编辑命令时,用{},且不同的命令之间用分号隔开,
    [root@node2 scprits]# sed -n '1,2!{=;p}' data
    3
    This is the secong data line
    4
    This is the last line
    用!表示对前面的匹配的模式取反
    [root@node2 scprits]# sed -n '1,2!p' data
    This is the secong data line
    This is the last line
    [root@node2 scprits]# sed -n '1,5p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    [root@node2 scprits]# sed -n '/^ro*t/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    [root@node2 scprits]# sed -n '/^r.*t/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    [root@node2 scprits]# sed -n '/o{1}/p' /etc/passwd 
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    polkitd:x:999:997:User for polkitd:/:/sbin/nologin
    abrt:x:173:173::/etc/abrt:/sbin/nologin
    tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    chrony:x:998:996::/var/lib/chrony:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    nginx:x:997:995::/home/nginx:/sbin/nologin
    [root@node2 scprits]# sed -n '/o{2,3}/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    [root@node2 scprits]# sed -n '/^#/!p' /etc/vsftpd/vsftpd.conf 
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    [root@node2 scprits]# sed -n '/^#/!{/^$/!p}' /etc/vsftpd/vsftpd.conf 
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES

    打印除#号开头和空行的所有的行。

    [root@node2 scprits]# sed -e '/^#/d' -e '/^$/d' /etc/vsftpd/vsftpd.conf
    anonymous_enable=YES
    local_enable=YES
    write_enable=YES
    local_umask=022
    dirmessage_enable=YES
    xferlog_enable=YES
    connect_from_port_20=YES
    xferlog_std_format=YES
    listen=NO
    listen_ipv6=YES
    pam_service_name=vsftpd
    userlist_enable=YES
    tcp_wrappers=YES
    [root@node2 scprits]# sed -n '1,/adm/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    [root@node2 scprits]# sed -i '1 ised command start' data
    [root@node2 scprits]# cat data 
    sed command start
    This is the header line
    This is the first data line
    This is the secong data line
    This is the last line
    文件的行首添加一行
    [root@node2 scprits]#  sed -i '$a sed command end' data
    [root@node2 scprits]# cat data 
    sed command start
    This is the header line
    This is the first data line
    This is the secong data line
    This is the last line
    sed command end
    文件的行尾追加一行
    [root@node2 scprits]# cat myfile 
    hello world
    hello linux
    how are you
    i am fine
    thanks,and you
    [root@node2 scprits]# sed -n '/hello/s/^/Li /' myfile 
    [root@node2 scprits]# sed  '/hello/s/^/Li /' myfile 
    Li hello world
    Li hello linux
    how are you
    i am fine
    thanks,and you
    在匹配helo字段的行,行首添加Li这个字符串。
    [root@node2 scprits]# sed 's/linux/jie &/' myfile 
    hello world
    hello jie linux
    how are you
    i am fine
    thanks,and you
    在匹配linux字符串的行,在linux字符串前加上jie
    [root@node2 scprits]# sed 's/linux/jie& /' myfile 
    hello world
    hello jielinux 
    how are you
    i am fine
    thanks,and you
    
    [root@node2 scprits]# sed 's/linux/& jie/' myfile 
    hello world
    hello linux jie
    how are you
    i am fine
    thanks,and you
    [root@node2 scprits]# sed  '/you/s/$/Li/' myfile 
    hello world
    hello linux
    how are youLi
    i am fine
    thanks,and youLi
    在匹配you字符串的行的行尾加上Li
    [root@node2 scprits]# sed '/you/s/(.*)/1 Li/' myfile 
    hello world
    hello linux
    how are you Li
    i am fine
    thanks,and you Li
    用正则表达式,()表示分组,.*表示任意字符,1引用第一个分组,因为匹配的是任意字符,所整行都匹配了,在添加的时候就添加到行尾。
    [root@node2 scprits]# sed '/are/i nihao' myfile
    hello world
    hello linux
    nihao
    how are you
    i am fine
    thanks,and you
    [root@node2 scprits]# sed '/are/i
    ihao' myfile
    hello world
    hello linux
    nihao
    how are you
    i am fine
    thanks,and you
    View Code
    [root@node2 scprits]# sed '/are/i/nihao' myfile
    hello world
    hello linux
    /nihao
    how are you
    i am fine
    thanks,and you
    [root@node2 scprits]# sed '/are/a nihao' myfile
    hello world
    hello linux
    how are you
    nihao
    i am fine
    thanks,and you
    [root@node2 scprits]# sed '/are/a nihao
     wo hen hao' myfile
    hello world
    hello linux
    how are you
    nihao
     wo hen hao
    i am fine
    thanks,and you
    追加多行要使用n
    [root@node2 scprits]# sed 's/^/start /g' myfile 
    start hello world
    start hello linux
    start how are you
    start i am fine
    start thanks,and you
    start       每行开头加一个start
    [root@node2 scprits]# sed 's/$/ end /g' myfile 
    hello world end 
    hello linux end 
    how are you end 
    i am fine end 
    thanks,and you end 
     end 
    [root@node2 scprits]# sed '1,3s/^/#/g' myfile 
    #hello world
    #hello linux
    #how are you
    i am fine
    thanks,and you
    1至3行打注释

    [root@node2 scprits]# sed 's/fine/very &/p' myfile
    hello world
    hello linux
    how are you
    i am very fine
    i am very fine
    thanks,and you

    在匹配fine这行的前面加上very字符串,后面接p参数表上添加两行同样的,不加p参数只添加1行。

    [root@node2 scprits]# cat myfile 
    sedcommand
    #hello world tail and tail
    #hello linux tail and tail
    #how are you end
    i am fine end
    thanks,and you end
    [root@node2 scprits]# sed -i -e '/sed/d' -e '/^$/d' myfile
    [root@node2 scprits]# cat myfile
    #hello world tail and tail
    #hello linux tail and tail
    #how are you end
    i am fine end
    thanks,and you end
    [root@node2 scprits]# sed -i '/i/d' myfile
    [root@node2 scprits]# sed -i '/end/d' myfile
    [root@node2 scprits]# cat myfile

    重点:sed命令实现对文件内容的替换(替换是在shell自动化脚本中用到最多的操作)

    [root@node2 scprits]# cat test.txt 
    anonymous_enable=YES  
    write_enable=YES  
    local_umask=022  
    xferlog_enable=YES  
    connect_from_port_20=YES  
    root:x:0:0:root:/root:/bin/bash  
    bin:x:1:1:bin:/bin:/sbin/nologin  
    daemon:x:2:2:daemon:/sbin:/sbin/nologin  
    adm:x:3:4:adm:/var/adm:/sbin/nologin  
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
    DEVICE="eth0"  
    BOOTPROTO="static"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    IPADDR=172.16.22.1  
    NETMASK=255.255.0.0  
    [root@node2 scprits]# sed -i '/DEVICE/cEthernet' test.txt 
     #匹配DEVICE的行,替换成Ethernet这行 
    [root@node2 scprits]# sed -i 's/static/dhcp/' test.txt
    #把static替换成dhcp(/,@,#都是前面所说的地址定界符)   
    [root@node2 scprits]# sed -i '/IPADDR/s@22.1@10.12@' test.txt 
    #匹配IPADDR的行,把22.1替换成10.12由于.号有特殊意义所有需要转义 
    [root@node2 scprits]# sed -i '/connect/s#YES#NO#' test.txt 
    #匹配connect的行,把YES替换成NO  
    [root@node2 scprits]#  sed -i 's/bin/tom/2g' test.txt 
    #把所有匹配到bin的行中第二次及第二次之后出现bin替换成tom  
    [root@node2 scprits]# sed -i 's/daemon/jerry/2p' test.txt 
    [root@node2 scprits]# sed -i 's/adm/boss/2' test.txt 
    #把所有匹配到adm的行中仅仅只是第二次出现的adm替换成boss  
    [root@node2 scprits]# sed -i '/root/{s/bash/nologin/;s/0/1/g}' test.txt 
    #匹配root的行,把bash替换成nologin,且把0替换成1  
    [root@node2 scprits]# sed -i 's/root/(&)/g' test.txt 
    #把root用括号括起来,&表示引用前面匹配的字符 
    [root@node2 scprits]# sed -i 's/BOOTPROTO/#BOOTPROTO/' test.txt 
    #匹配BOOTPROTO替换成#BOOTPROTO,在配置文件中一般用于注释某行 
    [root@node2 scprits]# sed -i 's/ONBOOT/#&/' test.txt 
    匹配ONBOOT的行的前面添加#号,在配置文件中也表示注释某行 
    [root@node2 scprits]# sed -i '/ONBOOT/s/#//' test.txt 
    #匹配ONBOOT的行,把#替换成空,即去掉#号,也一般用作去掉#注释
    [root@node2 scprits]# cat test.txt 
    anonymous_enable=YES  
    write_enable=YES  
    local_umask=022  
    xferlog_enable=YES  
    connect_from_port_20=NO  
    (root):x:1:1:(root):/(root):/bin/nologin  
    bin:x:1:1:tom:/tom:/stom/nologin  
    daemon:x:2:2:jerry:/sbin:/stom/nologin  
    daemon:x:2:2:jerry:/sbin:/stom/nologin  
    adm:x:3:4:boss:/var/adm:/sbin/nologin  
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin  
    Ethernet
    #BOOTPROTO="dhcp"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    IPADDR=172.16.10.12  
    NETMASK=255.255.0.0  

    sed引用变量:(在自动化shell脚本 中也经常会使用到变量)

    第一种当sed命令里面没有默认的变量时可以把单引号改成双引号;

    第二种当sed命令里面有默认的变量时,那自己定义的变量需要加单引号,且sed里面的语句必须用单引

    [root@node2 ~]# cat myfile 
    hello world  
    i am jie  
    how are you
    [root@node2 ~]# name=li         #定义一个变量。
    [root@node2 ~]# sed -i "s/jie/$name/" myfile
    [root@node2 ~]# cat myfile
    hello world  
    i am li  
    how are you
    [root@node2 ~]# sed -i '$a '$name'' myfile  #在引用自定义的变量时,sed语句必须用单引引住,然后把自定义的变量也用单引号引住  
    [root@node2 ~]# cat myfile 
    hello world  
    i am li  
    how are you
    li

    sed的其它高级使用:

    1)把正在用sed操作的文件的内容写到例外一个文件中

    [root@node2 ~]# cat > test << eof
    > Ethernet  
    > #BOOTPROTO="dhcp"  
    > HWADDR="00:0C:29:90:79:78"  
    > ONBOOT="yes"  
    > IPADDR=172.16.10.12  
    > NETMASK=255.255.0.0 
    > eof
    [root@node2 ~]# sed -i 's/IPADDR/ip/w ip.txt' test  #把sed操作的文件内容保存到另外一个文件中,w表示保存,ip.txt文件名  
    [root@node2 ~]# cat ip.txt
    ip=172.16.10.12  

    读取一个文件到正在用sed操作的文件中

    [root@node2 ~]# cat myfile
    hello world  
    i am li  
    how are you
    li
    [root@node2 ~]# cat test
    Ethernet  
    #BOOTPROTO="dhcp"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    ip=172.16.10.12  
    NETMASK=255.255.0.0 
    [root@node2 ~]# sed  -i '/Ethernet/r myfile' test      #在匹配Ethernet的行,读进来另一个文件的内容,读进来的文件的内容会插入到匹配Ethernet的行后 
    [root@node2 ~]# cat test
    Ethernet  
    hello world  
    i am li  
    how are you
    li
    #BOOTPROTO="dhcp"  
    HWADDR="00:0C:29:90:79:78"  
    ONBOOT="yes"  
    ip=172.16.10.12  
    NETMASK=255.255.0.0 

    sed的经典例子:

    [root@node2 ~]# cat file 
    http://www.baidu.com/index.<a target="_blank" href="http://www.2cto.com/kf/qianduan/css/" class="keylink" style="border:none; padding:0px; margin:0px; color:rgb(51,51,51); text-decoration:none; font-size:14px">html</a>  
    http://www.baidu.com/1.html  
    http://post.baidu.com/index.html  
    http://mp3.baidu.com/index.html  
    http://www.baidu.com/3.html  
    http://post.baidu.com/2.html 
    得到如下结果:  
    域名的出现的次数 域名  
    3 www.baidu.com  
    2 post.baidu.com  
    [root@node2 ~]# cat file  |awk -F "/" '{count[$3]++}END{for(i in count){print i,count[i]}}'
    post.baidu.com 2
    www.baidu.com 3
    mp3.baidu.com 1
    [root@localhost shell]# cat file | sed -e ' s/http:////' -e ' s//.*//' | sort | uniq -c | sort -rn  
    3 www.baidu.com  
    2 post.baidu.com  
    1 mp3.baidu.com  
    root@node2 ~]# cat file | sed -e ' s/http:////' -e ' s//.*//' | sort | uniq -c | sort -rn 
          3 www.baidu.com
          2 post.baidu.com
          1 mp3.baidu.com

    用grep结合sed取出网卡的ip地址 

  • 相关阅读:
    新文章new图标
    3.6SiteFactory专业版,顶部导航的最后一个栏目向下移位的解决办法
    http://goodboy5264.blog.163.com/
    提升你网站水平的 jQuery 插件推荐
    如何把导航条做成sitefactory政府版的样子实现动态读取子栏目显示
    好的链接
    2011年度最佳jQuery插件
    asp中日期时间函数介绍
    若干设计模式学习
    多线程学习
  • 原文地址:https://www.cnblogs.com/liujunjun/p/11971987.html
Copyright © 2020-2023  润新知