sed练习
1、用sed取出df -h显示出的/dev开头的已用磁盘的数据,带单位。如红框内容为所提取数据
[root@centos8 ~]#df -h|sed -rn '/^\/dev\/sd/s@.* (.*[MG]) .*[MG].*@\1@p'
2.4G
390M
169M
[root@centos8 ~]#df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 957M 0 957M 0% /dev
tmpfs 975M 0 975M 0% /dev/shm
tmpfs 975M 49M 927M 5% /run
tmpfs 975M 0 975M 0% /sys/fs/cgroup
/dev/sda2 100G 2.4G 98G 3% /
/dev/sda3 50G 390M 50G 1% /data
/dev/sda1 1014M 169M 846M 17% /boot
/dev/sr0 8.7G 8.7G 0 100% /mnt
tmpfs 195M 0 195M 0% /run/user/0
2、用sed取出free -h 剩余空间内容,不带单位(假定单位都是Gi),如下图红框中的内容 为 所提取的内容
[root@centos8 ~]#free -h |sed -nr -e '2s#.* (.*[MG]i) .*[MG]i.*[MG]i.*[MG]i$#\1#p' -e '3s#.* (.*[MG]i)$#\1#p'
1.1Gi
4.0Gi
总结:sed 字符匹配逻辑是从行尾开始,从右到左的顺序。
发现sed计算字符的时候从$符开始计算,如:在free -h题中,如果想从左到右的顺序来匹配想要的打印结果,按照这种逻辑代码是这么写的,
[root@centos8 ~]#free -h |sed -nr -e '2s#.*: .*[MG]i.*[MG]i (.*[MG]i) .*$#\1#p' -e '3s#.* (.*[MG]i)$#\1#p'
503Mi
4.0Gi
但是打印结果不是想要的,所以sed 匹配顺序是行尾开始,从右到左的顺。
例如打印第3行的时候,可以利用这个逻辑,直接写一个[MG]i即可。甚至不用告诉sed位置在$,或者直接加任意字符 .*
按照这个逻辑第1题也就好理解了。
[root@centos8 ~]#free -h |sed -nr -e '2s#.*: .*[MG]i.*[MG]i (.*[MG]i) .*$#\1#p' -e '3s#.* (.*[MG]i)$#\1#p'
503Mi
4.0Gi
[root@centos8 ~]#free -h |sed -nr -e '2s#.*: .*[MG]i.*[MG]i (.*[MG]i) .*$#\1#p' -e '3s#.* (.*[MG]i)#\1#p'
503Mi
4.0Gi
[root@centos8 ~]#free -h |sed -nr -e '2s#.*: .*[MG]i.*[MG]i (.*[MG]i) .*$#\1#p' -e '3s#.* (.*[MG]i).*#\1#p'
503Mi
4.0Gi