何らかの理由でこのコマンドを使用してJSON出力をjq
解析することはできません。curl
grep
、、などの標準のUnixツールを使用して特定のフィールドを抽出する必要がありますawk
。sed
出力例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
フォーマットが常に例に示されているようにip
1行ずつ表示される場合、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 }')