我正在编写自己的脚本,以告诉我是否使用了超过500个MiB的数据。我使用vnstat -d来获取有关数据使用的信息。vnstat -d 输出在这里

产出应是:
我只想要“总计”列中的值。我的输出列出了所有列的数据。从以下几个方面更好地说明:
#!/bin/bash
for i in `vnstat -d | grep -a [0-9] `; //get numerical values in i (-a tag as vnstat outputs in binary)
do
NUMBER=$(echo $i | grep -o '[5-9][0-9][0-9]'); //store values >500 in a var called NUMBER
echo $NUMBER;
done;我是一个自学的新手,所以请不要打我。
我从上面的脚本中接收到的当前输出:
600
654
925
884
923
871
967
868我想要的输出应该是:
654
923
967发布于 2020-06-04 00:17:35
简化:
#/bin/bash
if [[ $(( $(vnstat -d --oneline|cut -d';' -f6|cut -d. -f1|paste -sd '+') )) -ge 500 ]];then
echo 500 Mb reached
fi(脚本所做的是从每个接口中从类似于oneliner CSV的输出中获取指定的字段,然后裁剪整数并对它们进行求和。然后比较该和是否等于或大于500。如果是的话,then输出一条消息)
注意:
-f6将解析“今日总计”流量。
您可以将其替换为:
-f4 =今天的rx
今天的-f5 = tx
发布于 2020-06-04 02:27:52
您希望解析一个管道分隔的表,并且只检查特定的列,对于此工作,有一些工具比grep更合适,例如,您可以编写一个小型bash脚本,在其中使用cut命令提取并处理数据,或者awk。
下面是一个使用awk的解决方案。我们打印该列的编号> 500,total。将命令输出发送到
awk -F "|" '($3+0>=500){print $3}'-F将字段分隔符设置为|$3+0用于将以数字开头的字符串转换为该数字,这样我们就可以将其作为数字处理并进行比较。
现在,如果您真的想提取列total > 500 MiB的所有值,那么预期的输出应该包括以GiB表示的所有值,因为它们是> 1000 MiB,例如,邪恶屏幕截图中的最小值是0.98 GiB,即1003 MiB。所以我们可以把它加到第一个条件上。
awk -F "|" '($3 ~ /GiB/ || $3+0>500){print $3}'
现在,如果希望输出仅为MiB中的整数,则可以将其修改为:
awk -F "|" '($3 ~ /GiB/){$3=1024*$3+0} ($3+0>500){printf "%.0f\n",$3}'在这里,我们将所有GiB值转换为MiB,然后进行比较。
发布于 2020-06-03 23:58:13
#!/bin/bash
IFS=$'\n'
for i in `vnstat -d`; do # get each lines
VALUE=$(echo $i | cut -d\| -f3) # get total value with unit, in case you want to check for GiB values
NUMBER=$(echo $VALUE | grep -o '[0-9.*]' | cut -d. -f1); # split the string by '|', get the number part, store the integer part into NUMBER
if [[ $NUMBER -ge 500 && "$VALUE" == *"MiB"* || "$VALUE" == *"GiB"* ]]; then # if the number is greater than or equals to 500 OR it's in GiB
echo $VALUE; # echo the value
fi
done当然,如果您想要的话,可以去掉GiB检查。
编辑:在开头添加IFS=$'\n‘。这允许for循环使用结束行作为分隔符。
https://stackoverflow.com/questions/62184559
复制相似问题