
以下の dev-netpro.sh スクリプトに $FWK (例: '8fwk3_dev 2fwk0_dev' - 最大 9 ワード可能) と $CON (例では一連の数字: '72 43) がある場合、'curl' 何も公開されません。 172 28021 8261 14015 325 24 524 ')複数の単語を取得
[Expert@WAL-NEW-VSX-02:0]# cat dev-netpro.sh
#!/bin/bash
while true; do
FWK=$(top -b -n 1 | egrep 'fwk' | awk '{print $9 $NF}')
CON=$(vsx stat -l | egrep 'number' | awk '{print $3}')
TIME=`date +"%T"`
echo $HOSTNAME, $TIME, $FWK, $CON
echo '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}'
curl -ik -H "Accept: application/json" -H "Content-type: application/json" -d '{"WAL-VSX-02": "['"$TIME"','"$FWK"','"$CON"']"}' -X POST "https://10.199.107.11:8880/test"
sleep 2
done
[Expert@WAL-NEW-VSX-02:0]#
以下の出力を参照してください。
[Expert@WAL-NEW-VSX-02:0]# ./dev-netpro.sh
WAL-NEW-VSX-02, 12:53:17, 8fwk3_dev 2fwk0_dev, 72 43 172 28021 8261 14015 325 24 524
{"WAL-VSX-02": "[12:53:17,8fwk3_dev
2fwk0_dev,72
43
172
28021
8261
14015
325
24
524]"}
......何もない
答え1
改行は、スクリプトの先頭で実行されるこれら2つのコマンドから来ます。後ろに
FWK=$(echo $FWK|tr -d '\n') CON=$(echo $CON|tr -d '\n')
効率的!ご協力ありがとうございました
答え2
JSONオブジェクト内のコンテンツの周りに引用符が必要であり、スペースが別の引数として処理された後に変数内のスペースが何も生成されないように文字列全体を引用する必要があります。
echo "{\"WAL-VSX-02\": [\"$TIME\",\"$FWK\",\"$CON\"]}"
以前の方法では、文字列の複数のコンポーネントの周りに(二重引用符)がありますが、変数にスペースが含まれている場合、シェルはそれを別の文字列に解析しました。これにより、内容全体が引用されるため、シェルはそれを文字列として解析します。
答え3
JSONドキュメントにランダムな文字列を含めるには、その文字列をJSON文字列に正しくエンコードする必要があります。これは、次のようにJSONを理解するユーティリティを使用して実行するのが最善ですjq
。
#!/bin/bash
while true; do
fwk=$( top -b -n 1 | awk '/fwk/ { print $9 $NF }' )
con=$( vsx stat -l | awk '/number/ { print $3 }' )
printf -v now '%(%T)T' -1
jq -cn \
'{ "WAL-VSX-02": $ARGS.positional }' \
--args "$now" "$fwk" "$con" |
curl --silent --show-error \
--json @- 'https://10.199.107.11:8880/test'
sleep 2
done
上記のコードでは、.jsonを使用してJSONドキュメントを生成しますjq
。ドキュメントにはキーを持つJSONオブジェクトが含まれていますWAL-VSX-02
。キー値は、--args
コマンドの最後にリストされた文字列を要素として含む配列になります。
JSONオブジェクトはパイプcurl
で接続されています--json @-
。
各繰り返しに公開されたJSONを表示するには、tee
間に新しいパイプラインステップを挿入します。jq
curl
あなたの質問で見ることができるデータを考えると、次のJSONドキュメントが生成され公開されます。
{
"WAL-VSX-02": [
"12:53:17",
"8fwk3_dev\n2fwk0_dev",
"72\n43\n172\n28021\n8261\n14015\n325\n24\n524"
]
}
-c
(しかし、私たちが使用したオプションのために1行にありますjq
。)
もう少し努力すると、これらの複数行の文字列を別々の配列として公開できます。与えられた文字列を新しい行に分割するには、わずかに変更された式を使用しますjq
(最初の文字列を除く)。
jq -cn \
'{ "WAL-VSX-02": ( $ARGS.positional | .[1:] |= map(split("\n")) ) }' \
--args "$now" "$fwk" "$con"
これにより、次のような結果が得られます。
{
"WAL-VSX-02": [
"12:53:17",
[ "8fwk3_dev", "2fwk0_dev" ],
[ "72", "43", "172", "28021", "8261", "14015", "325", "24", "524" ]
]
}