この行から「name」の値を取得する必要があります
"snapshots": [{"name":"sLVZt","user":"comment","current":"n","created":"2015-03-11 05:28:02"},{"name":"ubg9x","user":"test2",{"name":"lo3Qp","user":"test3","current":"y","created":"2015-03-11 06:02:46"}]}
出力は次のようになると予想しています
sLVZt
ubg9x
lo3Qp
答え1
JSONドキュメントが有効であると仮定すると、
{"snapshots":[{"name":"sLVZt","user":"comment","current":"n","created":"2015-03-11 05:28:02"},{"name":"ubg9x","user":"test2"},{"name":"lo3Qp","user":"test3","current":"y","created":"2015-03-11 06:02:46"}]}
または(データ以外の空白はフォーマットには関係ないため)、
{
"snapshots": [
{
"name": "sLVZt",
"user": "comment",
"current": "n",
"created": "2015-03-11 05:28:02"
},
{
"name": "ubg9x",
"user": "test2"
},
{
"name": "lo3Qp",
"user": "test3",
"current": "y",
"created": "2015-03-11 06:02:46"
}
]
}
次のように使用しますjq
:
$ jq -r '.snapshots[].name' file.json
sLVZt
ubg9x
lo3Qp
name
これにより、配列の各要素のキーの値が抽出されますsnapshots
。
さまざまな方法で、他のキーの値に基づいて結果を簡単にフィルタリングすることもできます。
$ jq -r '.snapshots[] | select(.current == "y").name' file.json
lo3Qp
$ jq -r '.snapshots[] | select(.current != "n").name' file.json
ubg9x
lo3Qp
答え2
Linux を使用している場合、または GNU にアクセスできる場合はgrep
、次の操作を実行できます。
$ grep -oP '"name":"\K[^"]+' file
sLVZt
ubg9x
lo3Qp
あるいは、Perl では次のようになります。
$ perl -lne 'print join "\n", /"name":"([^"]+)/g' file
sLVZt
ubg9x
lo3Qp
答え3
これを試して、
sed 's/,/\n/g' file | awk -F '"' '$2~/name/ {print $(NF-1)}'
sLVZt
ubg9x
lo3Qp
答え4
純粋にawk
ベースのソリューションは次のようになります。
awk -F':' -v RS=',' '$1 ~ /"name"$/ {print $2}' file
これは入力を受け取り、「レコード」(通常はライン)を に分割し,
、すべてのレコードを のフィールドに分割して:
、レコードごとに2つのフィールドを残します。最初のフィールドが終了(先頭の角括弧/中括弧を考慮します)で"name"
、 の後ろの値である 2 番目のフィールドを出力します:
。
括弧の二重引用符を削除したい場合は、次のようにします。
awk -F':' -v RS=',' '$1 ~ /"name"$/ {gsub("\"","",$2); print $2}' file
アップデート
修正されたサンプル入力には先頭の が含まれており"snapshots":
、これには も含まれています:
が、「不均衡な」方法であるため、これはもう機能しません。私の回答では「純粋に ベース」と述べられているためawk
、唯一の可能な適応ははるかに複雑になり、次のようになります。
awk '{n=patsplit($0,field,"\"[^\"]*\":\"[^\"]*\""); for (i=1;i<=n;i++) {split(field[i],elem,":"); if (elem[1]=="\"name\"") print elem[2];};}' file
明らかに、これはgrep
ベースのアプローチよりもはるかに洗練されておらず、移植性も低くなります (たとえば、 では動作しませんmawk
)。