コマンド出力から値を抽出し、その値を後続のコマンドの引数として使用します。

コマンド出力から値を抽出し、その値を後続のコマンドの引数として使用します。

こんにちは欲しい

curl -v --request POST https://example.com --data-urlencode "username=usr]” --data-urlencode "password=[pass]”

出力を[TOKEN]ここのフィールドに渡します。

curl -D - --request POST https://example.com --data-urlencode token=[TOKEN]

しかし、最初のコマンドの出力は次のようになるため、JSONには慣れていません。

{
    "token": "value_of_token"
}

どうやってこれを受け入れて"value_of_token"実現できますか[TOKEN]

ベストアンサー1

value_of_tokenコマンド出力の効率を最大化するには、curl出力を単一sed(ストリームエディタ)コマンドにパイプします。コマンド置換を使用して、$()出力をシェル変数に保存します。

token=$(curl ... | sed -n '/ *"token": *"/ { s///; s/".*//; p; }')

tokenその後、その変数を2番目のコマンドのパラメータとして参照できますcurl

curl ... token="$token"

コマンドの説明sed:

sed -n '/ *"token" *: *"/ { s///; s/".*//; p; q; }'
  • -nオプションがsed教えてくれるいいえ各入力行を印刷します。

  • / *"token" *: *"/この値を含む行のアドレスを指定します。このパターン(正規表現)は、タグ値を区切る最初の二重引用符を含む行の最初の先頭に一致します。

  • {指定された行に適用されるコマンドブロックを開始します。

  • s///;sedコマンドは、以前に一致した内容(アドレス部分から)を削除します。これで、行(「パターンスペース」)は次のようになります。value_of_token"

  • s/".*//sedコマンドは、残りの二重引用符(")とそれの後のすべてのエントリを削除します。

  • psedコマンドは、現在(編集された)行(sed「パターンスペース」という用語)を印刷します。

  • qsed スクリプトをすぐに終了し、入力を処理しなくなりました。

  • '}' はコマンドブロックを終了します。

例えば、

$ echo '
{                          
    "token": "value_of_token"
}
' | sed -n '/ *"token" *: *"/ { s///; s/".*//; p; }'
value_of_token
$

この方法は、同じ結果を得るために4つの異なるコマンドをパイプするよりもはるかに効率的です。このsedコマンドは、JSON入力にタブ文字がないと仮定します。タブがある場合は、sedコマンドを変更する必要があります。

おすすめ記事