我正在为Linux系统开发一个shell脚本(使用Bash)。
作为此脚本的一部分,我使用awk来获取ping请求丢弃的数据包百分比。从下面显示的终端执行时,此工作正常:
test=`ping gnu.org -c10 | tail -2`; echo $test | awk '{printf $6 "\b"}'
这将获取丢弃的数据包的百分比,并使用退格转义字符回显它,以显示" 0"相当棕褐色" 0%" - 这是因为稍后将值用作整数值。
在脚本中,代码如下所示:
#Pings the gateway ten times and stores the result
local pingResults=`ping -c10 $gateway | tail -2`
#Uses awk to get the percentage of packets lost using \b to remove the %
local packetsLost=`echo $pingResults | awk '{printf $6 "\b"}'`
我从packetsLost返回值并回显它,它给出" 0%",完全忽略了\ b
有人可以解释为什么在shell脚本中发生这种情况以及我如何解决这个问题?
我知道有一些替代品,例如使用cut,但我希望尽可能简单有效地保持这条线。
答案 0 :(得分:1)
OMG!基于字数统计解析人类可读的字符串是完全不可维护的(“只写”)并且不可预测。尽量避免它。实际上很简单:
$ ping -q gnu.org -c10 |\
gawk '{ if (match ($0, /([[:digit:]]+(\.[[:digit:]]+)?)% packet loss/, a)) print a[1]; }'
0
a[1]
此处对应于正则表达式中的第一个()
组。
P上。 S.解析人类可读输出时,必须确保语言环境(即语言)与脚本编写时的预期相同,因此在实际代码中ping
调用应如下所示:
local pingResults=$(LANG=C ping -q -c10 "$gateway")
(即使iputils-ping
似乎没有任何翻译。)
答案 1 :(得分:0)
检查下一个:
echo 1x 2x 3x 4x 5x 6x 7x | awk '{printf $6 "\b"}' | od -cb
您将获得下一个输出:
0000000 6 x \b
066 170 010
所以,当你运行
时echo 1x 2x 3x 4x 5x 6x 7x | awk '{printf $6 "\b"}'
你打印了:
现在运行:
aaa=$(echo 1x 2x 3x 4x 5x 6x 7x | awk '{printf $6 "\b"}')
将结果存储到aaa
,并显示其内容:
echo $aaa | od -bc
0000000 066 170 010 012
6 x \b \n
当想要相同的结果时,请使用:
echo -n $aaa
总而言之,请使用:
local packetsLost=`echo $pingResults | awk '{printf $6 "\b"}'`
echo -n $packetLost
答案 2 :(得分:0)
awk '{sub(/%/, "", $6); printf $6}
要么
awk '{print substr($6, 1, length($6) - 1)}'