Как извлечь файл JSON с помощью awk / sed?

1092
Praveen Prakasan

Входные данные.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 } ] } 

Ожидаемый результат

User Size aaa 121 bbb 123 

Как сделать преобразование JSON в приведенную выше таблицу? Пожалуйста, помогите мне.

0
Добро пожаловать в Супер пользователя! что ты уже испробовал? Какие исследования вы провели? :) bertieb 5 лет назад 0

2 ответа на вопрос

4
gronostaj

Единственно честный правильный ответ:

Не.

awkи sedне являются правильными инструментами для работы. Вы не сможете должным образом справиться с экранированием и кодировкой JSON. Вы можете попытаться охватить некоторые базовые случаи, но вы также можете просто использовать подходящий инструмент: jq .

jq решение

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

(в качестве альтернативы вы можете передать JSON в команду вместо чтения из файла)

Чтобы выровнять столбцы:

jq '.items[] | "\(.user) \(.size)"' -r /path/to/file | column -t 
+1 за «НЕ» делайте это с помощью awk или sed, то есть многих вещей, которые вы можете пропустить и усложнить. Если у вас есть PHP на той же машине, то это всего лишь один вызов "json_decode ()" Alex 5 лет назад 0
1
Alex

Ну, хотя я полностью согласен с @gronostaj по поводу НЕ использовать awkили sedкак инструмент для анализа JSON, я знаю, что иногда могут быть случаи, когда вы не можете использовать что-то еще, кроме того, что поставляется с ОС.

Если вы абсолютно уверены, что JSON, который вы разместили, всегда будет в том же формате, что и вы, то решение приведено ниже:

#!/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) } ' 
Привет Алекс, Как добавить поле даты, как 2018-07-19 qqqq 201084 Praveen Prakasan 5 лет назад 0
Я обновил скрипт, поэтому он также включает в себя поле данных ... Alex 5 лет назад 0