由curl + awk解析时的奇怪行为

时间:2019-01-07 11:03:00

标签: bash jenkins awk

在Ubuntu上使用curl,我试图获取受以下方面启发的Jenkins版本:

https://wiki.jenkins.io/display/JENKINS/Remote+access+API

在bash脚本中,我这样做:

VERSION=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" $URL | grep -Fi X-Jenkins: | awk '{print $2}')
echo "__A__[${VERSION}]__B__"

但是当我运行脚本时,我得到了:

]__B__2.89.2

因此出于某种原因,前缀__A__[被吞下,并且后缀变成了前缀

我还尝试使用以下方法修剪输出:

VERSION=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" $URL | grep -Fi X-Jenkins: | awk '{print $2}' | sed -e 's/^[ \t]*//')

但是它给出相同的结果。

如下所示,我也尝试过:

echo '__A__['"${VERSION}"']__B__'

但仍然给出相同/错误的结果。

我尝试过的其他一些事情(给出了相同的结果)

输出相同/错误

VERSION=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" $URL | grep -i X-Jenkins: | awk '{print $2}')
echo '__A__['"${VERSION}"']__B__'

输出相同/错误

VERSION=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" $URL | grep X-Jenkins: | awk '{print $2}')
echo '__A__['"${VERSION}"']__B__'

基于以下建议,我现在尝试:

echo $VERSION|od -ax

哪个给:

0000000   2   .   8   9   .   2  cr  nl
           2e32    3938    322e    0a0d
0000010

如果我将其与:

VERSION_TEMP="2.89.2"
echo $VERSION_TEMP|od -ax

我得到:

0000000   2   .   8   9   .   2  nl
           2e32    3938    322e    000a
0000007

因此,看起来是VERSION变量中的cr引起了问题(不确定如何如上所述解释前缀/后缀的整个反转)。

已解决:根据罗密欧的输入,我现在可以使用它添加|tr -d '\r'了:

VERSION=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" $URL | grep X-Jenkins: | awk '{print $2}'|tr -d '\r')

1 个答案:

答案 0 :(得分:1)

显然,输出包含DOS回车。

尝试添加tr -d '\015'

version=$(curl -k -i -X GET --insecure --silent --header \"Authorization: Bearer $TOKEN \" "$URL" |
    tr -d '\015' |
   awk 'tolower($0) !~ /x-jenkins:/{print $2}')
echo "__A__[$version]__B__"

大写变量名保留供系统使用,因此我也将小写变量名更改为小写,并删除了useless grep.