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#()()#\1\2#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:x\2:\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#([^:]+)(:.*:)(/.*$)#\3\2\1#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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM