Memo/JavaScript/jq

https://dexlab.net:443/pukiwiki/index.php?Memo/JavaScript/jq
 

jq: JSONのCLIパーサ

  • jq CLIツール
  • 整形
echo '{ "key1":"value1" }' | jq .
{
  "key1": "value1"
}
  • オプション
    • -r: ダブルクオーテーション等の引用符を出力しない
    • -c: コンパクト。1行に納める
  • 記事

一部の配列を文字列へ変換したい。

  • 全体はtsvで出力。ResourceRecords[] は複数の値があるので、カンマ区切りに変換。
  • join()は配列しか受け取らないので、「[.ResourceRecords[].Value]」で配列に変換している。
    • 配列に変換しないと、「Cannot iterate over string」エラー。
  • echo '
    {
        "ResourceRecordSets": [
            {
                "ResourceRecords": [
                    {
                        "Value": "ns-xxxx.awsdns-04.com."
                    },
                    {
                        "Value": "ns-xxxx.awsdns-02.org."
                    },
                    {
                        "Value": "ns-xxxx.awsdns-03.co.uk."
                    },
                    {
                        "Value": "ns-xxxx.awsdns-01.net."
                    }
                ],
                "Type": "NS",
                "Name": "example.com.",
                "TTL": 172800
            }
       ]
    }
    ' | jq -r '.ResourceRecordSets[] | [.Name, .Type, ([.ResourceRecords[].Value] | sort | join(","))] | @tsv'
    
    example.com.    NS      ns-xxxx.awsdns-01.net.,ns-xxxx.awsdns-02.org.,ns-xxxx.awsdns-03.co.uk.,ns-xxxx.awsdns-04.com.

検索: select()

  • td-agent(fluentd) で buffer_queue_length > 0 のものだけを選択
    curl -s localhost:24220/api/plugins.json | jq '.plugins[] | select(.buffer_queue_length > 0)'
  • 完全一致
    .select(.Value == "example")
  • 正規表現を使って検索
    .select(.Value | test("example"))
  • 「.DeleteOnTermination == false」ec2をterminateしても、自動削除されないEBSのvol-idを表示。手動で削除する必要あり。
    aws ec2 describe-instances --instance-ids i-xxxx --profile example > ec2.i-xxxx.json
    cat ec2.i-xxxx.json  | jq -r '.Reservations[].Instances[].BlockDeviceMappings[].Ebs | select(.DeleteOnTermination == false) | .VolumeId'

nullを無視して検索

select()する時にnullが混ざっていると「Cannot iterate over null (null)」が出る。

  • .[]?

    Like .[], but no errors will be output if . is not an array or object.

  • 例: Valueに"example2" を含むレコードを出力
    echo '{"ResourceRecordSets":[{"AliasTarget":{"HostedZoneId":"example","EvaluateTargetHealth":false,"DNSName":"example.ap-northeast-1.elb.amazonaws.com."},"Type":"A","Name":"example.com."},{"ResourceRecords":[{"Value":"example2.ap-northeast-1.elb.amazonaws.com."}],"Type":"CNAME","Name":"www.example.com.","TTL":300}]}' \
    | jq '.ResourceRecordSets[] | select(.ResourceRecords[]?.Value | test("example2"))'

出力形式指定: csv, tsv, etc

  • dict型をarray型へ変換後、@csv出力
    echo '[ { "name": "foo", "val": 10 }, { "name": "bar", "val": 20 }  ]' | jq -r '.[] | [.name, .val] | @csv'
    "foo",10
    "bar",20

件数、合計、平均、最大、最小

  • 件数: length
  • 合計: add
  • 平均: add/length
  • 最大: max
  • 最小: min
  • 例:valを元に計算
    echo '[ { "id": 1, "val": 10 }, { "id": 2, "val": 20 }  ]' | jq '[.[].val] | length, add, add/length, max, min'
    2  # length
    30 # add
    15 # add/length
    20 # max
    10 # min

インストール

  • CentOS 7: epelリポジトリにある
    sudo yum install jq --enablerepo=epel
  • Ubuntu 18.04 LTS:
    sudo apt install jq

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2019-07-30 (火) 12:08:16 (22d)