所以我有一个GET命令从服务器检索数据,只需要这个信息的特定部分。
我有一个工作脚本,但awk部分很长,我想知道我是否可以得到一些帮助缩短它。
当前脚本:
curl --insecure -u $HMCUSER:$HMCPASS -H "Accept: */*" -H "Content-type: application/json" -s --header "X-API-Session:$COOKIE" -X GET https://$HMCIP:6794$BCID1/blades | awk -F\" '{print $50" M1:"$42"\n"$114" M1:"$106"\n"$18" M1:"$10"\n"$98" M1:"$90"\n"$34" M1:"$26"\n"$82" M1:"$74"\n"$66" M1:"$58"\n"$130" M1:"$122}' > ~walkers/blade-info-new
echo -e "\n`cat blade-info-new`\n"
结果是:
/api/叶片/394a7ea8-02d4-11e1-b71a-5CF3FCAD1A 40 M1:B.1.01
/api/叶片/749f35cc-02d7-11e1-946a-5cf3fcad1ef8 M1:B.1.02
/api/叶片/eeae9670-02d5-11e1-a5ee-5cf3fcad21e0 M1:B.1.03
/api/叶片/3949f5a0-02d4-11e1-85df-5cf3fcad1dc8 M1:B.1.04
/api/叶片/d25df328-02d3-11e1-a1e9-5cf3fcad2158 M1:B.1.05
/api/叶片/bbecebd8-02d0-11e1-aca7-5cf3fcacf4a0 M1:B.1.06
/api/叶片/3016b5d8-02d7-11e1-a66f-5cf3fcad1dd0 M1:B.1.07
/api/叶片/75796586-02ea-11e1-8ab0-5cf3fcacf040 M1:B.1.08
(有两列:/api/blades/。。。和M1:B.1.0#)
所以我试了一下:
for i in {10..130..8}
do
try=$(curl --insecure -u $HMCUSER:$HMCPASS -H "Accept: */*" -H "Content-type: application/json" -s --header "X-API-Session:$COOKIE" -X GET https://$HMCIP:6794$BCID1/blades | awk -v i=$i -F\" '{print $i}')
echo "$try"
done
希望得到与上面相同的输出,而我只得到完整的JSON对象:
{“blades”:[{“status”:“operating”,“name”:“B.1.03”,“type”:“system-x”,“object uri”:“/api/blades/eeae9670-02d5-11e1-a5ee-5cf3fcad21e0”},{“status”:“operating”,“name”:“B.1.05”,“type”:“system-x”,“object uri”:“/api/blades/d25df328-02d3-11e1-a1e9-5cf3fcad2158”},{“status”:“operating”,“name”:“B.1.01”,“type”:“system-x”,“object uri”:/api/blades/394a7ea8-02d4-11e1-11e1-11e1-b71a-5cf3fcadaaa140“},{“status”:“operating”,“name”:“B.1.07”,“type”:“system-x”,“object uri”:/api/blades/3016b5d8-0216b5d8-02d7-11e17-11e16-5cf3fcad1d0“},{“status”:“operating”,“name”:“B.1.06”,“type”:“system-x”,“object uri”:/api/blades/bbecbd8-02d0-11e1-02d0-11e1-11e17-5cf3fcf3fcfcf3fcaa“status”:“操作”,“name”:“B.1.04”,“type”:“system-x”,“object uri”:/api/blades/3949f5a0-02d4-02d4-11e1-85df-5cff3fcad1dc8“},{“status”:“operating”,“name”:“B.1.02”,“type”:“system-x”,“object uri”:/api/blades/749f35cc-02d7-11e1-11e1-946a-5cf3fcad1ef8“},{“status”:“operating”,“name”:“B.1.08”,“type”:“system-x”,“object uri”:“/api/blades/api/blades/7579656586-07796586-02ea-11e1-11e1-11e1-11e1-40“}]}
所以我想知道如何让变量起作用?我上过很多网站,每个人似乎都说
awk -v i=$i
应该有用。。。编辑:我要打印的序列是对象uri(即/api/blades/…),后跟刀片名称(即B.1.01)。这些信息都在curl命令返回的JSON对象中,从第10个字段开始,之后每隔8个字段(使用“作为分隔符):
{“blades”:[{“status”:“operating”,“name”:“B.1.03”,“type”:“system-x”,“object uri”:“/api/blades/eeae9670-02d5-11e1-a5ee-5cf3fcad21e0”},{“status”:“operating”,“name”:“B.1.05”,“type”:“system-x”,“object uri”:“/api/blades/d25df328-02d3-11e1-a1e9-5cf3fcad2158”},{“status”:“operating”,“name”:“B.1.01”,“type”:“system-x”,“object uri”:/api/blades/394a7ea8-02d4-11e1-11e1-11e1-b71a-5cf3fcadaaa140“},{“status”:“operating”,“name”:“B.1.07”,“type”:“system-x”,“object uri”:/api/blades/3016b5d8-0216b5d8-02d7-11e17-11e16-5cf3fcad1d0“},{“status”:“operating”,“name”:“B.1.06”,“type”:“system-x”,“object uri”:/api/blades/bbecbd8-02d0-11e1-02d0-11e1-11e17-5cf3fcf3fcfcf3fcaa“status”:“操作”,“name”:“B.1.04”,“type”:“system-x”,“object uri”:/api/blades/3949f5a0-02d4-02d4-11e1-85df-5cff3fcad1dc8“},{“status”:“operating”,“name”:“B.1.02”,“type”:“system-x”,“object uri”:/api/blades/749f35cc-02d7-11e1-11e1-946a-5cf3fcad1ef8“},{“status”:“operating”,“name”:“B.1.08”,“type”:“system-x”,“object uri”:“/api/blades/api/blades/7579656586-07796586-02ea-11e1-11e1-11e1-11e1-40“}]}
刀片名称不必按数字顺序排列(B.1.01到B.1.08),只需与相应的ID位于同一行
编辑2:找到了解决办法。使用C类型for循环而不是普通bash:
for (( i=10; i<=130; i+=8 ))
而不是for i in {10..130..8}
最佳答案
如果我理解正确的话,您需要{10..130..8}展开以给出所需的$I值序列。
在我的bash版本(ooo ld:3.2.25)中,字符串{10..130..8}不会扩展到任何内容,因此循环是用i=“{10..130..8}”输入的,因此awk使用${10..130..8},它看起来简化为$0(即整个curl返回字符串)。这就是你的问题。您可以将echo $i
放入循环中来测试是否是这种情况。
你需要一个更好的方法来获得你想要的一系列价值观。您可以使用“seq”进行此操作(man seq
了解更多信息)。$( seq 10 8 130 )
应该这样做。
而且,你可以使curl只被调用一次 # Construct the string of fields for i in $( seq 10 8 130 ); do fields="$fields,\$$i" done fields=$( echo "$fields" | sed 's/^,//' ) # Remove the leading comma ...curl command... | awk '{print '$fields'}'