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
     
  • 相关阅读:
    CF1454F Array Partition
    leetcode1883 准时抵达会议现场的最小跳过休息次数
    leetcode1871 跳跃游戏 VII
    leetcode1872 石子游戏VIII
    CF1355C Count Triangles
    CF1245D Shichikuji and Power Grid
    CF1368C Even Picture
    CF1368D AND, OR and square sum
    CF1395C Boboniu and Bit Operations
    SpringBoot和开发热部署
  • 原文地址:https://www.cnblogs.com/zoe233/p/11920446.html
Copyright © 2011-2022 走看看