Wie extrahiere ich Json-Datei mit awk / sed?

1285
Praveen Prakasan

Eingabedaten.json

{ "lastUpdateTime" : "2018-07-20T10:56:26.000Z", "items" : [ { "date" : "2018-07-19T21:09:27.000Z", "user" : "dddd", "size" : 5219402, "rawSize" : 15658206, "numFiles" : 119 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "aaaa", "size" : 20524410845, "rawSize" : 61573215663, "numFiles" : 7540 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "wwww", "size" : 0, "rawSize" : 0, "numFiles" : 2 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "qqqq", "size" : 201084, "rawSize" : 603252, "numFiles" : 25 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "ttttt", "size" : 280395332, "rawSize" : 288900666, "numFiles" : 199 } ] } 

Erwartete Ausgabe

User Size aaa 121 bbb 123 

Wie konvertiere ich JSON in die obige Tabelle? Bitte hilf mir.

0
Willkommen bei Super User! Was hast du bisher versucht? Was hast du recherchiert? :) bertieb vor 6 Jahren 0

2 Antworten auf die Frage

4
gronostaj

Die einzig ehrlich richtige Antwort ist:

Nicht

awkund sedsind nicht die richtigen Werkzeuge für den Job. Mit JSON-Escaping und -Codierung können Sie nicht richtig umgehen. Sie können versuchen, einige Basisfälle zu behandeln, aber Sie können auch ein geeignetes Werkzeug verwenden: jq .

jq Lösung

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file 

(Alternativ können Sie JSON in den Befehl einleiten, anstatt ihn aus der Datei zu lesen.)

Spalten ausrichten:

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t 
+1 für "DON'T" tun Sie es mit awk oder sed, viel zu viele Dinge können Sie weglassen und zu kompliziert sein. Wenn Sie PHP auf demselben Rechner haben, dann ist es nur eine Frage des Einzelaufrufs von "json_decode ()". Alex vor 6 Jahren 0
1
Alex

Nun, obwohl ich mit @gronostaj völlig einverstanden bin, was NICHT verwendet wird awkoder sedals Parsing-Tool für JSON, weiß ich manchmal, dass es Fälle gibt, in denen Sie nichts anderes verwenden können, außer was mit dem Betriebssystem mitgeliefert wird.

Wenn Sie absolut sicher sind, dass das von Ihnen gepostete JSON immer dasselbe Format hat wie Sie, ist die Lösung unten:

#!/bin/sh  data=' { "lastUpdateTime" : "2018-07-20T10:56:26.000Z", "items" : [ { "date" : "2018-07-19T21:09:27.000Z", "user" : "dddd", "size" : 5219402, "rawSize" : 15658206, "numFiles" : 119 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "aaaa", "size" : 20524410845, "rawSize" : 61573215663, "numFiles" : 7540 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "wwww", "size" : 0, "rawSize" : 0, "numFiles" : 2 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "qqqq", "size" : 201084, "rawSize" : 603252, "numFiles" : 25 }, { "date" : "2018-07-19T21:09:27.000Z", "user" : "ttttt", "size" : 280395332, "rawSize" : 288900666, "numFiles" : 199 } ] } ' ########################################################### echo "$" | awk -F: 'BEGIN{ printf ("%s\t\t%s\t%s\n","Date", "User", "Size") } /lastUpdateTime/  /date/ { gsub(/\"|,|\s/,""); gsub(/T.+$/,""); printf ("%s\t", $2) } /user/ { gsub(/\"|,|\s/,""); printf ("%s\t", $2) } /size/ { gsub(/\"|,|\s/,""); printf ("%s\n", $2) } ' 
Hallo Alex, Wie füge ich ein Datumsfeld hinzu wie 2018-07-19 qqqq 201084 Praveen Prakasan vor 6 Jahren 0
Ich habe das Skript aktualisiert, also enthält es auch Datenfelder ... Alex vor 6 Jahren 0