特定の単語の後の値を取得する必要があります

特定の単語の後の値を取得する必要があります

この行から「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)。

関連情報