在Bash脚本中使用带有转义字符的Awk

时间:2014-08-01 22:24:31

标签: linux bash shell awk escaping

我正在为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,但我希望尽可能简单有效地保持这条线。

3 个答案:

答案 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"}'
你打印了:

  • character 6
  • character x
  • 字符退格(导致字符在TERMINAL中删除的原因)

现在运行:

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)}'