1. 取系统 ip
- [[email protected] logs]# ifconfig eth3
- eth3 Link encap:Ethernet HWaddr 08:00:27:4C:6F:AD
- .NET 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 所在的行, 取第二行
- [[email protected] /]# ifconfig eth3|sed -n '2p'
- .NET addr:192.168.0.109 Bcast:192.168.0.255 Mask:255.255.255.0
- # 第二步: 取中间的内容, 先将前面的一段匹配掉, 替换掉
- [[email protected] /]# ifconfig eth3|sed -n '2p'|sed 's#inet addr:##g'
- 192.168.0.109 Bcast:192.168.0.255 Mask:255.255.255.0
- # 取内容时, 必须要在这行内容中是唯一的, 不是唯一的, 默认会取到最后一个
- [[email protected] /]# ifconfig eth3|sed -n '2p'|sed 's#^.*:##g'
- 255.255.255.0
- # 将 以任意字符开头的, 长度 0-N 个的, 以 dr: 为结尾的内容替换掉
- [[email protected] /]# ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g'
- 192.168.0.109 Bcast:192.168.0.255 Mask:255.255.255.0
- # 第三步: 将要取的 ip 内容的后端从开头取替换掉
- [[email protected] /]# ifconfig eth3|sed -n '2p'|sed 's#^.*dr:##g'|sed 's# B.*$##g'
- 192.168.0.109
处理技巧:
匹配需要的目标 (获取的字符串, 如本例中的 ip) 前的字符串一般用以... 开头 (^.*) 来匹配开头, 匹配的结尾写上实际的字符.
如:"^.*addr:" 表达式就匹配 "inet addr:"
而处理需要的目标后的内容, 一般在匹配的开头写上实际的字符, 而结尾是用以... 结尾 (.*$) 来匹配.
如:"Bcast:.*$" 部分匹配表示 "Bcast:10.0.0.255 Mask:255.255.255.0"
方法 2:
替换命令: sed -n 's# 支持正则位置 ##gp' file
指定行号: s 前的 2 为 行号
- sed -n '2s# 支持正则位置 ##gp' file
- [[email protected] /]# 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
测试和说明:
- [[email protected] /]# cat a.txt
- I am oldboy Linux.
- # 取任意字符开头, 取任意字符一直到 m; 然后 () 内容是要输出的内容, 任意字符; 后面是以 "L" 开头的任意字符 (N 个) 结尾.
- # 替换掉 () 外面的内容, 输出 () 内的内容
- [[email protected] /]# sed -nr 's#^.*m (.*) L.*$#\1#gp' a.txt
- oldboy
当正则匹配部分使用(), 第一个括号, 可以在后面的部分用 "\1" 来输出; 第二个括号的内容, 可以用 "\2" 来输出.
获取 ip 的方法:
- # 取第二行, 开头任意字符, 是...r:() Bc..., 输出 () 的内容.
- [[email protected] /]# ifconfig eth3|sed -nr '2s#^.*r:(.*) Bc.*$#\1#gp'
- 192.168.0.109
- # 第二行都不取, 条件定义好, 直接就能输出结果
- [[email protected] /]# ifconfig eth3|sed -nr 's#^.*r:(.*) Bc.*$#\1#gp'
- 192.168.0.109
方法 4: 用 awk,grep 等文本处理方式分列获取, sed 命令是用于学习的
- [[email protected] 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:
- [[email protected] /]# 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
答案:
- [[email protected] /]# stat /etc/hosts|sed -nr 's#^.*: \(0(.*)/-rw.*$#\1#gp'
- 644
2. 将下面文件内容的第一列和最后一列做个对调
- [[email protected] /]# 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:()()()三块分别借助单个匹配的特征, 输出再拼接
- [[email protected] /]# 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:()()()三组分别匹配上内容
- [[email protected] /]# 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
来源: http://www.bubuko.com/infodetail-3301240.html