首页 > 解决方案 > 如何操作字符串和前导零

问题描述

在我解释这个问题之前,我必须对此做一些澄清。

我正在为我的 dd-wrt ​​路由器更改一个 vpn 脚本。请注意,这个路由器没有 bash,所以我通过 entware 安装了它,就像 sed grep cut 等所有命令一样。

现在,我的脚本调用另一个脚本并从中收集数据。被调用脚本的输出是

./nordvpn-server-find -l fr

Looking for servers located in FR with current capacity lower than 30%...

fr27.nordvpn.com     9%
fr104.nordvpn.com    10%
fr169.nordvpn.com    10%
fr25.nordvpn.com     10%
fr37.nordvpn.com     10%
fr80.nordvpn.com     11%
fr98.nordvpn.com     11%
fr114.nordvpn.com    12%
fr127.nordvpn.com    13%
fr16.nordvpn.com     13%
fr133.nordvpn.com    14%
fr41.nordvpn.com     14%
fr50.nordvpn.com     14%
fr62.nordvpn.com     14%
fr67.nordvpn.com     14%
fr19.nordvpn.com     15%
fr30.nordvpn.com     15%
fr31.nordvpn.com     15%
fr46.nordvpn.com     15%
fr84.nordvpn.com     15%

如您所见,是当前负载的服务器列表,此列表按列格式化,因此在我的脚本中,我使用此命令仅获取该列表的前 3 个服务器

declare -a SERVERDIRS  # declare an array
SERVERDIRS+=($($COMMANDSPATH/bash $JFFSPATH/nordvpn-server-find -l it \
    | $COMMANDSPATH/head -6 | $COMMANDSPATH/tail -3 | $COMMANDSPATH/awk '{print $1}'))  

echo
echo ${SERVERDIRS[*]}  # echo all the elements of the array
echo "number of element in array" ${#SERVERDIRS[@]}
echo "first element in array" ${SERVERDIRS[0]}
echo "last element in array" ${SERVERDIRS[${#SERVERDIRS[@]}-1]}

请注意 $COMMANDSPATH 和 $JFFSPATH 是我指向正确位置的路径变量。如您所见,如果我没记错的话,我将前 3 个服务器放入一个数组中,然后我可以对其进行操作,这里是关于数组创建的输出

#vpn rnd

fr27.nordvpn.com fr104.nordvpn.com fr169.nordvpn.com
number of element in array 3
first element in array fr27.nordvpn.com
last element in array fr169.nordvpn.com

现在看起来一切都很好,数组是 3 个元素,依此类推

所以我的期望是提取第一个“。”之前的所有数据。然后将其格式化为 4 位数字,例如 fr27.nordvpn.com -> 必须变为 -> fr0027 等等。

所以我尝试了这种方法 https://repl.it/@jorman/JovialAngryWebpages 确实有效,在 repl.it 但我不知道为什么,在 bash 上不行!查看此解决方案的输出

    vpn rnd
    first var
    econd var 36
    1
    80
    third var
    
    irst var
    econd var 36
    1
    129
    third var
    
    irst var
    econd var 36
    1
    37
    third var

似乎有一个奇怪的错误,缺少 char "irst" 而不是 first 和 other,所以我在调试模式下运行它,查看日志

+ declare -a SERVERDIRS
+ SERVERDIRS+=($($COMMANDSPATH/bash $JFFSPATH/nordvpn-server-find -l fr | $COMMANDSPATH/head -6 | $COMMANDSPATH/tail -3 | $COMMANDSPATH/awk '{print $1}'))
++ /opt/bin/head -6
++ /opt/bin/bash /jffs//nordvpn-server-find -l fr
++ /opt/bin/tail -3
++ /opt/bin/awk '{print $1}'
+ for i in "${SERVERDIRS[@]}"
++ /opt/bin/sed 's/\..*//'
++ echo 'fr188.nordvpn.com'
++ /opt/bin/cut -c1-2
+ aaa='
pt/bin/sed 's/\..*//'
++ echo 'fr188.nordvpn.com'
++ /opt/bin/grep -oP '\d+'
+ bbb='36
1
188'
++ printf %04d 36 1 188
+ bbbmod=003600010188
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
188'
second var 36
1
188
+ echo 'third var
hird var
cho

+ for i in "${SERVERDIRS[@]}"
++ echo 'fr193.nordvpn.com'
++ /opt/bin/cut -c1-2
++ /opt/bin/sed 's/\..*//'
+ aaa='
pt/bin/sed 's/\..*//'
++ /opt/bin/grep -oP '\d+'
++ echo 'fr193.nordvpn.com'
+ bbb='36
1
193'
++ printf %04d 36 1 193
+ bbbmod=003600010193
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
193'
second var 36
1
193
+ echo 'third var
hird var
cho

+ for i in "${SERVERDIRS[@]}"
++ echo 'fr194.nordvpn.com'
++ /opt/bin/sed 's/\..*//'
++ /opt/bin/cut -c1-2
+ aaa='
cho 'fr194.nordvpn.com'
++ /opt/bin/grep -oP '\d+'
++ /opt/bin/sed 's/\..*//'
+ bbb='36
1
194'
++ printf %04d 36 1 194
+ bbbmod=003600010194
+ ccc='
cho 'first var
irst var
cho 'second var 36
1
194'
second var 36
1
194
+ echo 'third var
hird var
cho

+ echo

+ echo 'fr188.nordvpn.com' 'fr193.nordvpn.com' 'fr194.nordvpn.com'
fr188.nordvpn.com fr193.nordvpn.com fr194.nordvpn.com
+ echo 'number of element in array' 3
number of element in array 3
+ echo 'first element in array' 'fr188.nordvpn.com'
first element in array fr188.nordvpn.com
+ echo 'last element in array' 'fr194.nordvpn.com'
last element in array fr194.nordvpn.com
+ echo

+ echo 'fr188.nordvpn.com'
+ /opt/bin/sed 's/\..*//'
+ /opt/bin/sed 's/[^0-9]*//g'
361188
+ exit

如果您注意到 3、6 和 1 似乎来自代码

++ /opt/bin/head -6
++ /opt/bin/bash /jffs//nordvpn-server-find -l fr
++ /opt/bin/tail -3
++ /opt/bin/awk '{print $1}'

我无法解释发生了什么。

我错过了一些代码?有更好的方法从数组中提取信息,我需要数组吗?

标签: arraysbashsedgrepcut

解决方案


我阅读了一些我将在这个小脚本中实现的好代码。

但我发现了问题:查看日志和调试,我看到这样的代码

[\033

在我的脑海中,我确信我已经看到了!

返回服务器的nordvpn脚本加载,用tput写入输出,所以输出是彩色的!碰巧所有这些信息都跳到代码中,当所有逻辑都切掉 grep 并解析所有信息时,“颜色代码”仍然存在并有所作为!

所以我禁用了彩色输出,所有的工作都像一个魅力!


推荐阅读