一些简单介绍:
tr -s后面使用引号引用了一个空格,作用是将管道传送的数据中连续的多个空格合并为一个空格。如果-s选项后面使用引号引用其他的字符,则效果也一样,可以把多个连续的特定字符合并为一个字符,如下所示:
root@host:/# echo "aaa bbb" | tr -s "a" a bbb root@host:/# echo "a---b---c" | tr -s "-" a-b-c root@host:/#而使用cut命令,可以帮助我们获取数据的特定列(使用-f选项指定需要获取的列数),并且可以通过-d选项设置以什么字符为列的分隔符。
root@host:/# echo "a-b-c" | cut -d"-" -f2 b root@host:/# echo "a b c" | cut -d" " -f3 c root@host:/# echo "a5b5c" | cut -d"5" -f1 a root@host:/#
每个系统的ifconfig输出的内容可能不一样。所以这可能并不是一个可移植的写法,我的ifconfig执行效果是这样的。
- root@host:/# ifconfig eth1
- eth1 Link encap:Ethernet HWaddr E0:38:2D:50:00:80
- inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
- inet6 addr: fe80::e238:2dff:fe50:80/64 Scope:Link
- UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
- RX packets:20074982 errors:0 dropped:20030304 overruns:0 frame:0
- TX packets:463901 errors:0 dropped:0 overruns:0 carrier:0
- collisions:0 txqueuelen:1000
- RX bytes:1368522166 (1.2 GiB) TX bytes:41718466 (39.7 MiB)
-
- root@host:/#
获取IP地址:
- root@host:/# ifconfig eth1 | grep Mask | tr -s " " | cut -d " " -f3 | cut -d":" -f2
- 192.168.0.3
- root@host:/#
步骤分解:
步骤1:先获取包含IP地址的行:
- root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
- inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
- root@host:~#
步骤2:去除多余空格:
- root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | tr -s " "
- inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
- root@host:~#
步骤3:将冒号替换为空格:
可以使用sed + awk:
- root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | tr -s " " | sed "s/:/ /g" | awk '{print $3}'
- 192.168.0.3
- root@host:~#
也可以使用cut
- root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | tr -s " " | cut -d" " -f3 | cut -d":" -f2
- 192.168.0.3
- root@host:~#
-
这种写法在ubuntu中也可以得到正确的结果:如下是ubuntu16中的测试:
- csdn@ubuntu:~$ ifconfig ens33 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | tr -s " " | cut -d" " -f3 | cut -d":" -f2
- 192.168.0.11
- csdn@ubuntu:~$
grep命令使用-o选项可以仅显示匹配内容,而不显示全行所有内容。grep -E和egrep是等效的。
输出配置到的IP地址的信息:
- root@host:~# ifconfig eth1 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
- 192.168.0.3
- 192.168.255.255
- 255.255.0.0
- root@host:~#
这样就可以很容易匹配IP地址,广播地址,子网掩码
匹配IP地址:
- root@host:~# ifconfig eth1 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sed -n 1p
- 192.168.0.3
- root@host:~#
-
广播地址:
- root@host:~# ifconfig eth1 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sed -n 2p
- 192.168.255.255
- root@host:~#
匹配掩码:
- root@host:~# ifconfig eth1 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sed -n 3p
- 255.255.0.0
- root@host:~#
使用free命令,如下所示,获取free列的值就可以了。
- root@host:/# free
- total used free shared buffers cached
- Mem: 510108 84252 425856 8 3960 11228
- -/+ buffers/cache: 69064 441044
- Swap: 0 0 0
- root@host:/#
获取空余free列内存值:该值是实时更新的,所以每次执行都不一样。
- root@host:/# free | grep Mem | tr -s " " | sed 's/:/ /' | awk '{print $4}'
- 425624
- root@host:/#
使用uptime,分别获取1分钟负载,5分钟负载和15分钟负载。把冒号和逗号全部变成空格。然后取列值,也就是第9,10,11列。
- root@host:/# uptime
- 11:41:47 up 11:41, load average: 0.01, 0.02, 0.04
- root@host:/#
编写获取负载的命令:
- root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $9}'
- 0.00
- root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $10}'
- 0.01
- root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $11}'
- 0.04
- root@host:/#
内容如下所示:sys_info.sh
- #!/bin/bash
- ip=$(ifconfig eth1 | grep Mask | tr -s " " | cut -d " " -f3 | cut -d":" -f2)
- freemem=$(free | grep Mem | tr -s " " | sed 's/:/ /' | awk '{print $4}')
- load=$(uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $9}')
-
- echo 'ip='${ip}
- echo 'freemem='${freemem}
- echo 'load='${load}
执行脚本:
- root@host:/# chmod +x sys_info.sh
- root@host:/# ./sys_info.sh
- ip=192.168.0.3
- freemem=425348
- load=0.00
- root@host:/#