Curl JSON出力から特定の値を抽出する方法

Curl JSON出力から特定の値を抽出する方法

何らかの理由でこのコマンドを使用してJSON出力をjq解析することはできません。curl

grep、、などの標準のUnixツールを使用して特定のフィールドを抽出する必要がありますawksed

出力例curl:

[
  {
    "case_id": 1500,
    "date": "13:58 02-02-2021",
    "user": "admin",
    "ip": "1.2.3.4",
    "type": "test",
    "active": "true"
  },
  {
    "case_id": 1501,
    "date": "14:45 02-02-2021",
    "user": "admin",
    "ip": "1.2.3.5",
    "type": "dev",
    "active": "false"
  }
]

ipフィールドsumの値を抽出するには正規表現が必要ですtype


純粋なIP 1.2.3.4を抽出する必要があります。

同じ行にカンマ区切りの値が必要です。たとえば、

1.2.3.4, test  
1.2.3.5, dev

答え1

awk解決策。

$ awk -F\" '$2~/^(ip|type)$/{a=a$4","}END{print substr(a,0,length(a)-1)}' file.txt
1.2.3.4,test,1.2.3.5,dev
$

答え2

他のものの別の変形

jq -r '.[]| "\(.ip), \(.type)"' < jsonfile

答え3

フォーマットが常に例に示されているようにip1行ずつ表示される場合、typeこの方法はsed機能します。

$ curl ... | sed -n '/ip\|type/{s/[^:]*: "\([^"]*\)"/\1/;N;s/\n[^:]*: "\([^"]*\).*/ \1/p};'
1.2.3.4, test
1.2.3.5, dev

別の行にあるがipまだ前に表示される場合は、typeこの回避策も機能します。

$ curl ... | sed -n '/ip/{s/[^:]*: "\([^"]*\)"/\1/;h;d};/type/{s/[^:]*: "\([^"]*\).*/\1/;x;G;s/\n/ /p}'
1.2.3.4, test
1.2.3.5, dev

答え4

paste -d ',' <(grep -wE 'ip' INPUT | awk -F'"' '{ print $4 }') <(grep -wE 'type' INPUT | awk -F'"' '{ print $4 }')

関連情報