gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:56:59 25 4
gpt4 key购买 nike

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

最佳答案

我的天哪!基于字数统计来解析人类可读的字符串是完全不可维护的(“只写”)且不可预测的。尽量避免它。其实很简单:

$ 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 似乎没有任何翻译。)

关于linux - 在 Bash 脚本中使用带有转义字符的 Awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25089568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com