我有一个 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 脚本尝试从供人类使用的 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输出jsonh
导致输出中仅显示每小时数据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