Bashスクリプトでjsonのキー値ペア値を見つける方法

Bashスクリプトでjsonのキー値ペア値を見つける方法

make s curl呼び出しを使用してbashスクリプトを作成し、jsonドキュメントを取得しようとしています。 jsonドキュメントには名前付きキーがaccess_tokenあり、そのフィールドの値を抽出する必要があります。これは私のJSONドキュメントです

echo $json

{"access_token":"kjdshfsd", "key2":"value"}

私はそれをインストールしていませんjq

答え1

短い答え:インストールjq

jsonパーサーなしでjsonを解析しないでください。

これを行うには、次のようにしますjq

echo "$json" | jq -r '.access_token'

またはecho、タブと改行エンコードが拡張されないようにするには、

jq -r -n --argjson data "$json" '$data.access_token'

私が好むJSONパーサーは次のとおりです。JSON、これを使用するには、次のことができます。

echo "$json" | json access_token

メモ:どちらのソリューションも、jsonオブジェクトが例に示されているものとまったく同じ(または少なくともほぼ同じ)であると仮定します。

答え2

いいえjq、、awksed

#!/bin/bash
json='{"access_token":"kjdshfsd", "key2":"value"}' 
    
echo $json | grep -o '"access_token":"[^"]*' | grep -o '[^"]*$'

ここでテストして作業しています。 https://ideone.com/Fw4How

源泉:https://brianchildress.co/parse-json-using-grep

答え3

jsonパーサーをインストールできない場合、文字列に二重引用符または改行文字を含めることができないと仮定すると、各レコードは1行にあり、各ラベルと値は公開されているように二重引用符で囲まれた文字列です。サンプル入力に示すように、このawkを使用するすべてのUNIXシステム上のすべてのシェルで機能します。

$ cat tst.awk
{
    while ( match($0,/"[^"]*"/) ) {
        hit = substr($0,RSTART+1,RLENGTH-2)
        if ( ++cnt % 2 ) {
            tag = hit
        }
        else {
            val = hit
            f[tag] = val
        }
        $0 = substr($0,RSTART+RLENGTH)
    }
    print f[tgt]
}

$ echo "$json" | awk -v tgt='access_token' -f tst.awk
kjdshfsd

$ echo "$json" | awk -v tgt='key2' -f tst.awk
value

答え4

あるいはjq、最新バージョンの miller( mlr) は、表の行のようにスカラー値のみを含む JSON オブジェクトの場合と同様に、表形式データを表す限り JSON 入力をサポートします。

printf %s "$json" | mlr --j2n cut -f access_token

mlr値を再フォーマットしないという利点(またはPoVによる欠点)があります。好き1e110.00000000000000001そうではありません10

関連情報