从 vnstat 获取数据的 Shell 脚本没有输出

问题描述 投票:0回答:1

我有一个 shell 脚本,我面临的数据输出问题是字符串,我认为它是空字符串,输出应该是浮点数我不是 shell 脚本编码员,也从未这样做过,但我正在寻找有人来修复它。该脚本用于从使用 vnstat 包创建的带宽表中获取值。

tempout1=$(vnstat -h| tail -n 2| awk -F\  '{ print $11}'| tail -n 1| awk -F\, '{ print $1}')
tempout2=$(vnstat -h| tail -n 2| awk -F\  '{ print $11}'| tail -n 1| awk -F\, '{ print $2}')
o=$tempout1$tempout2
bandwidth_out_unit=$(vnstat -h| tail -n 9| awk -F\) '{ print $6}'| head -n 1|awk -F\( '{ print $2}')
#echo $bandwidth_out_unit
case "$bandwidth_out_unit" in
KiB)    bandwidth_out_number_Byte=$(echo "$o*1024"| bc)
;;
MiB)    bandwidth_out_number_Byte=$(echo "$o*1024*1024"|bc)
;;
GiB)    bandwidth_out_number_Byte=$(echo "$o*1024*1024*1024"|bc)
;;
TiB)    bandwidth_out_number_Byte=$(echo "$o*1024*1024*1024*1024"|bc)
;;
esac
#echo $bandwidth_out_number_Byte

echo $bandwidth_out_number_Byte

我的期望是输出当前小时的total_outbound_for_current_hour,但它却没有输出任何内容,你能解决这个问题吗?顺便说一句,我不明白。我怎么知道我运行了 ./fileexample.sh 命令

请检查命令 vnstat 的输出

root@vmi1774425:~# vnstat -h

     hour        rx      |     tx      |    total    |   avg. rate
 ------------------------+-------------+-------------+---------------
 2024-04-30
     11:00      4.66 MiB |    8.23 MiB |   12.89 MiB |   30.02 kbit/s
     12:00      6.52 MiB |   10.13 MiB |   16.65 MiB |   38.80 kbit/s
     13:00      7.71 MiB |   16.90 MiB |   24.61 MiB |   57.35 kbit/s
     14:00      6.81 MiB |   10.03 MiB |   16.83 MiB |   39.23 kbit/s
     15:00      7.08 MiB |   10.80 MiB |   17.88 MiB |   41.65 kbit/s
     16:00      6.61 MiB |   10.30 MiB |   16.91 MiB |   42.99 kbit/s
 ------------------------+-------------+-------------+---------------

还有 vnstat --oneline b 的输出

1;eth0;2024-04-30;46370486;77009098;123379584;5429;2024-04;46370486;77009098;123379584;5429;46370486;77009098;123379584
shell
1个回答
0
投票

相关 shell 脚本尝试从供人类使用的 vnStat 每小时输出中提取当前小时的出站流量 (tx),然后将该值转换为字节。该脚本不再起作用的原因是,它被设计为使用 vnStat 在 1.x 版本中给出

-h
参数时用于每小时输出的文本图形输出样式。在版本 2.0 中,
-h
输出被重命名为
-hg
(小时图),并且
-h
现在生成列表模式输出,导致脚本盲目地尝试提取不再存在的字段。

虽然可以通过将

-h
替换为
-hg
来修改脚本以再次工作,但这不是正确的解决方案,因为输出仍然会至少受到所使用的系统区域设置和 vnStat 的输出样式设置的影响。

正确的解决方案是使用机器可读的输出。为此,vnStat 提供了

--json
。假设
jq
命令可用,完整的脚本可以简化为一行:

vnstat --json h 1 | jq .interfaces[0].traffic.hour[0].tx

  • --json
    指示vnStat输出json
  • h
    导致输出中仅显示每小时数据
  • 1
    结果仅显示最后一小时
  • jq
    用于从输出中提取正确的字段
  • .interfaces[0].traffic.hour[0].tx
    指示
    jq
    读取第一个接口,选择流量段,选择第一个小时,然后显示tx值(使用
    vnstat --json
    时始终以字节为单位)

如果使用的系统有多个接口(或者即使只有一个),建议也传递

-i
参数来指定所需的接口。例如,对于
eth0
,命令将为
vnstat --json h 1 -i eth0 | jq .interfaces[0].traffic.hour[0].tx

如果

jq
不可用且无法安装,则使用 shell 命令可能更容易解析
--xml
输出:
vnstat --xml h 1 -i eth0 | grep '<hour id' | cut -d\> -f21 | cut -d\< -f1

© www.soinside.com 2019 - 2024. All rights reserved.