
Eingabe data.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 helfen Sie mir.
Antwort1
Obwohl ich mit @gronostaj völlig einer Meinung bin, dass Sie es NICHT als Analysetool für JSON verwenden sollten awk
, sed
weiß ich, dass es manchmal Fälle geben kann, in denen Sie nichts anderes verwenden können als das, was im Betriebssystem enthalten ist.
Wenn Sie absolut sicher sind, dass das von Ihnen gepostete JSON immer im selben Format vorliegt, in dem Sie es gepostet haben, finden Sie die folgende Lösung:
#!/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 "${data}" | awk -F: 'BEGIN{
printf ("%s\t\t%s\t%s\n","Date", "User", "Size")
}
/lastUpdateTime/ {next}
/date/ { gsub(/\"|,|\s/,""); gsub(/T.+$/,""); printf ("%s\t", $2) }
/user/ { gsub(/\"|,|\s/,""); printf ("%s\t", $2) }
/size/ { gsub(/\"|,|\s/,""); printf ("%s\n", $2) }
'
Antwort2
Die einzig ehrlich richtige Antwort ist:
Nicht.
awk
und sed
sind nicht die richtigen Werkzeuge für diese Aufgabe. Sie werden nicht in der Lage sein, JSON-Escape und -Kodierung richtig zu handhaben. Sie könnten versuchen, einige Basisfälle abzudecken, aber Sie könnten genauso gut einfach ein richtiges Werkzeug verwenden:jq.
jq
Lösung
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file
(alternativ können Sie JSON in den Befehl einspeisen, anstatt es aus der Datei zu lesen)
So richten Sie Spalten aus:
jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t