Strange behavior when parsing result from curl + awk

痴心易碎 提交于 2021-02-11 05:58:16

问题


Using curl on ubuntu I am trying to fetch the Jenkins version inspired by:

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

In a bash script I do:

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

But when I run the script I get:

]__B__2.89.2

So for some reason the prefix: __A__[ gets swallowed and the suffix gets turned into a prefix.

I have also tried to trim the output with:

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

But it gives the same result.

As suggested below I have also tried with:

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

But still gives the same/wrong result.

A few other things I have tried (giving the same result)

Same/wrong output

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

Same/wrong output

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

Based on below suggestion I have now tried:

echo $VERSION|od -ax

Which gives:

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

If I compare that with:

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

I get:

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

So looks like its the cr in the VERSION var that is causing the issue (not sure how that explains the whole reversing of prefix/suffix as described above).

SOLVED: Based on input from Romeo I now got it to work with adding |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:


Apparently the output contains a DOS carriage return.

Try adding 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__"

Uppercase variable names are reserved for system use, so I changed yours to lower case, too, and removed the useless grep.



来源:https://stackoverflow.com/questions/54073123/strange-behavior-when-parsing-result-from-curl-awk

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!