zoukankan      html  css  js  c++  java
  • sed命令的正则表达式实践

    1. 取系统ip

    [root@oldboy logs]# ifconfig eth3 
    eth3      Link encap:Ethernet  HWaddr 08:00:27:4C:6F:AD  
              inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
              UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
              RX packets:18603 errors:0 dropped:0 overruns:0 frame:0
              TX packets:7782 errors:0 dropped:0 overruns:0 carrier:0
              collisions:0 txqueuelen:1000 
              RX bytes:2652530 (2.5 MiB)  TX bytes:1664897 (1.5 MiB)

    解答: 

    方法1:sed 's#支持正则##g' file

    # 第一步:取到ip所在的行,取第二行
    [root@oldboy /]# ifconfig eth3|sed -n '2p'
              inet addr:192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
              
    # 第二步:取中间的内容,先将前面的一段匹配掉,替换掉
    [root@oldboy /]# ifconfig eth3|sed -n '2p'|sed 's#inet addr:##g'
              192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
    # 取内容时,必须要在这行内容中是唯一的,不是唯一的,默认会取到最后一个
    [root@oldboy /]# ifconfig eth3|sed -n '2p'|sed 's#^.*:##g'      
    255.255.255.0
    
    # 将 以任意字符开头的,长度0-N个的,以dr: 为结尾的内容替换掉
    [root@oldboy /]# ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g' 
    192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
    
    # 第三步:将要取的ip内容的后端从开头取替换掉
    [root@oldboy /]# ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g'|sed 's#  B.*$##g'
    192.168.0.109

    处理技巧:

    1. 匹配需要的目标(获取的字符串,如本例中的ip)前的字符串一般用以...开头(^.*)来匹配开头,匹配的结尾写上实际的字符。 

      • 如:"^.*addr:" 表达式就匹配" inet addr:"
    2. 而处理需要的目标后的内容,一般在匹配的开头写上实际的字符,而结尾是用以...结尾(.*$)来匹配。
      • 如:"Bcast:.*$"部分匹配表示"Bcast:10.0.0.255 Mask:255.255.255.0"
     

    方法2:

    • 替换命令:sed -n 's#支持正则位置##gp' file

    • 指定行号:s前的2为 行号

      • sed -n '2s#支持正则位置##gp' file
    [root@oldboy /]# ifconfig eth3|sed -n '2s#^.*dr:##gp'
    192.168.0.109  Bcast:192.168.0.255  Mask:255.255.255.0
    
    [root@oldboy /]# ifconfig eth3|sed -n '2s#^.*dr:##gp'|sed -n 's#  Bc.*$##gp'
    192.168.0.109

    方法3:sed的后向引用 sed -nr 's#()()#12#gp' file

    测试和说明:

    [root@oldboy /]# cat a.txt
    I am oldboy Linux.
    
    # 取任意字符开头,取任意字符一直到m;然后()内容是要输出的内容,任意字符;后面是以"L"开头的任意字符(N个)结尾。
    # 替换掉 () 外面的内容,输出()内的内容
    [root@oldboy /]# sed -nr 's#^.*m (.*) L.*$#1#gp' a.txt
    oldboy

    当正则匹配部分使用(),第一个括号,可以在后面的部分用“1”来输出;第二个括号的内容,可以用"2"来输出。

     

    获取ip的方法:

    # 取第二行,开头任意字符,是...r:()  Bc...,输出 () 的内容。
    [root@oldboy /]# ifconfig eth3|sed -nr '2s#^.*r:(.*)  Bc.*$#1#gp'   
    192.168.0.109
    
    # 第二行都不取,条件定义好,直接就能输出结果
    [root@oldboy /]# ifconfig eth3|sed -nr 's#^.*r:(.*)  Bc.*$#1#gp' 
    192.168.0.109

    方法4: 用awk,grep等文本处理方式分列获取,sed命令是用于学习的

    [root@oldboy test]# ifconfig eth3|awk -F "[ :]+" 'NR==2 {print $4}' 
    192.168.0.109
    
    [root@oldboy test]# grep IPADDR /etc/sysconfig/network-scripts/ifcfg-eth3|cut -d "=" -f 2
    192.168.0.109

    sed 方法替换的扩展练习:

    1. 将下面文件的内容用sed替换方法取出 644:

    [root@oldboy /]# stat /etc/hosts
      File: `/etc/hosts'
      Size: 158             Blocks: 8          IO Block: 4096   regular file
    Device: 803h/2051d      Inode: 259614      Links: 2
    Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)
    Access: 2019-10-01 00:00:08.875025775 +0800
    Modify: 2010-01-12 21:28:22.000000000 +0800
    Change: 2019-08-30 08:12:59.831999996 +0800

    答案:

    [root@oldboy /]# stat /etc/hosts|sed -nr 's#^.*: (0(.*)/-rw.*$#1#gp'
    644

    2. 将下面文件内容的第一列和最后一列做个对调

    [root@oldboy /]# tail /etc/passwd
    haldaemon:x:68:68:HAL daemon:/:/sbin/nologin
    ntp:x:38:38::/etc/ntp:/sbin/nologin
    saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
    tcpdump:x:72:72::/:/sbin/nologin
    oldboy:x:500:500::/home/oldboy:/bin/bash
    zoe:x:501:501::/home/zoe:/bin/bash
    apache:x:48:48:Apache:/var/www:/sbin/nologin
    beaty:x:502:502::/home/beaty:/bin/bash

    答案:

    正则表达式1:()()()三块分别借助单个匹配的特征,输出再拼接

    [root@oldboy /]# tail /etc/passwd|sed -nr 's#(.*):x(.*):(.*)#3:x2:1#gp' 
    /sbin/nologin:x:68:68:HAL daemon:/:haldaemon
    /sbin/nologin:x:38:38::/etc/ntp:ntp
    /sbin/nologin:x:499:76:Saslauthd user:/var/empty/saslauth:saslauth
    /sbin/nologin:x:89:89::/var/spool/postfix:postfix
    /sbin/nologin:x:74:74:Privilege-separated SSH:/var/empty/sshd:sshd
    /sbin/nologin:x:72:72::/:tcpdump
    /bin/bash:x:500:500::/home/oldboy:oldboy
    /bin/bash:x:501:501::/home/zoe:zoe
    /sbin/nologin:x:48:48:Apache:/var/www:apache
    /bin/bash:x:502:502::/home/beaty:beaty

    正则表达式2:()()()三组分别匹配上内容

    [root@oldboy /]# sed -nr 's#([^:]+)(:.*:)(/.*$)#321#gp' /etc/passwd
    /bin/bash:x:0:0:root:/root:root
    /sbin/nologin:x:1:1:bin:/bin:bin
    /sbin/nologin:x:2:2:daemon:/sbin:daemon
    ...
    /bin/bash:x:501:501::/home/zoe:zoe
    /sbin/nologin:x:48:48:Apache:/var/www:apache
    /bin/bash:x:502:502::/home/beaty:beaty
     
  • 相关阅读:
    C# 设计模式-桥接模式
    C# 设计模式-外观模式
    C# 设计模式-代理模式
    楼层导航奇葩问题解决
    楼层导航和回顶部
    回顾
    禁止右击选中
    安装客服在线系统
    csdn 分享私藏的18个黑科技网站,想找什么软件就找什么软件!!!
    eyoucms 模板
  • 原文地址:https://www.cnblogs.com/zoe233/p/11920446.html
Copyright © 2011-2022 走看看