• 使用脚本获取系统信息


    前言

    一些简单介绍:

    tr -s后面使用引号引用了一个空格,作用是将管道传送的数据中连续的多个空格合并为一个空格。如果-s选项后面使用引号引用其他的字符,则效果也一样,可以把多个连续的特定字符合并为一个字符,如下所示:

    1. root@host:/# echo "aaa bbb" | tr -s "a"
    2. a bbb
    3. root@host:/# echo "a---b---c" | tr -s "-"
    4. a-b-c
    5. root@host:/#

    而使用cut命令,可以帮助我们获取数据的特定列(使用-f选项指定需要获取的列数),并且可以通过-d选项设置以什么字符为列的分隔符。

    1. root@host:/# echo "a-b-c" | cut -d"-" -f2
    2. b
    3. root@host:/# echo "a b c" | cut -d" " -f3
    4. c
    5. root@host:/# echo "a5b5c" | cut -d"5" -f1
    6. a
    7. root@host:/#

    一 获取IP地址

    每个系统的ifconfig输出的内容可能不一样。所以这可能并不是一个可移植的写法,我的ifconfig执行效果是这样的。

    1. root@host:/# ifconfig eth1
    2. eth1 Link encap:Ethernet HWaddr E0:38:2D:50:00:80
    3. inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
    4. inet6 addr: fe80::e238:2dff:fe50:80/64 Scope:Link
    5. UP BROADCAST RUNNING ALLMULTI MULTICAST MTU:1500 Metric:1
    6. RX packets:20074982 errors:0 dropped:20030304 overruns:0 frame:0
    7. TX packets:463901 errors:0 dropped:0 overruns:0 carrier:0
    8. collisions:0 txqueuelen:1000
    9. RX bytes:1368522166 (1.2 GiB) TX bytes:41718466 (39.7 MiB)
    10. root@host:/#

    获取IP地址: 

    方法1:这是不具备可移植性的方法

    1. root@host:/# ifconfig eth1 | grep Mask | tr -s " " | cut -d " " -f3 | cut -d":" -f2
    2. 192.168.0.3
    3. root@host:/#

    方法2:这是移植性比较好的方法。

    步骤分解:

    步骤1:先获取包含IP地址的行:

    1. root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    2. inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
    3. root@host:~#

     步骤2:去除多余空格:

    1. root@host:~# ifconfig eth1 | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | tr -s " "
    2. inet addr:192.168.0.3 Bcast:192.168.255.255 Mask:255.255.0.0
    3. root@host:~#

    步骤3:将冒号替换为空格:

    可以使用sed + awk:

    1. 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}'
    2. 192.168.0.3
    3. root@host:~#

    也可以使用cut 

    1. 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
    2. 192.168.0.3
    3. root@host:~#

    这种写法在ubuntu中也可以得到正确的结果:如下是ubuntu16中的测试:

    1. 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
    2. 192.168.0.11
    3. csdn@ubuntu:~$

    方法三:grep -o的巧妙使用

    grep命令使用-o选项可以仅显示匹配内容,而不显示全行所有内容。grep -E和egrep是等效的。

     输出配置到的IP地址的信息:

    1. root@host:~# ifconfig eth1 | grep -Eo "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}"
    2. 192.168.0.3
    3. 192.168.255.255
    4. 255.255.0.0
    5. root@host:~#

    这样就可以很容易匹配IP地址,广播地址,子网掩码

    匹配IP地址: 

    1. 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
    2. 192.168.0.3
    3. root@host:~#

    广播地址:

    1. 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
    2. 192.168.255.255
    3. root@host:~#

     匹配掩码:

    1. 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
    2. 255.255.0.0
    3. root@host:~#

    二 获取空余内存

    使用free命令,如下所示,获取free列的值就可以了。

    1. root@host:/# free
    2. total used free shared buffers cached
    3. Mem: 510108 84252 425856 8 3960 11228
    4. -/+ buffers/cache: 69064 441044
    5. Swap: 0 0 0
    6. root@host:/#

    获取空余free列内存值:该值是实时更新的,所以每次执行都不一样。

    1. root@host:/# free | grep Mem | tr -s " " | sed 's/:/ /' | awk '{print $4}'
    2. 425624
    3. root@host:/#

    三 获取负载

    使用uptime,分别获取1分钟负载,5分钟负载和15分钟负载。把冒号和逗号全部变成空格。然后取列值,也就是第9,10,11列。

    1. root@host:/# uptime
    2. 11:41:47 up 11:41, load average: 0.01, 0.02, 0.04
    3. root@host:/#

    编写获取负载的命令: 

    1. root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $9}'
    2. 0.00
    3. root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $10}'
    4. 0.01
    5. root@host:/# uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $11}'
    6. 0.04
    7. root@host:/#

    四 综合实例脚本

    内容如下所示:sys_info.sh

    1. #!/bin/bash
    2. ip=$(ifconfig eth1 | grep Mask | tr -s " " | cut -d " " -f3 | cut -d":" -f2)
    3. freemem=$(free | grep Mem | tr -s " " | sed 's/:/ /' | awk '{print $4}')
    4. load=$(uptime | tr -s " "|sed -r 's/[:,]/ /g' | awk '{print $9}')
    5. echo 'ip='${ip}
    6. echo 'freemem='${freemem}
    7. echo 'load='${load}

    执行脚本:

    1. root@host:/# chmod +x sys_info.sh
    2. root@host:/# ./sys_info.sh
    3. ip=192.168.0.3
    4. freemem=425348
    5. load=0.00
    6. root@host:/#

    小结

  • 相关阅读:
    Telink TLSR8258DK开发板zigbee开发
    easy-chatroom开发之一对一聊天
    《QT实用小工具·三十九》仿 Windows10 画图3D 的颜色选择器, 但更加强大
    低代码平台选型(一)| 引擎篇
    1.7.1、常见的计算机网络体系结构
    R语言拟合ARIMA模型:剔除ARIMA模型中不显著的系数、设置fixed参数指定需要被剔除的系数(参数)
    python系列教程215——列表解析与矩阵
    比特币上的 zk-SNARKs
    oracle实验四
    UDP单播和组播通讯之C#设计笔记(十四)
  • 原文地址:https://blog.csdn.net/yueni_zhao/article/details/128045614