Разбор JSON с инструментами Unix - PullRequest
717 голосов
/ 24 декабря 2009

Я пытаюсь проанализировать JSON, возвращенный из запроса curl, например:

curl 'http://twitter.com/users/username.json' |
    sed -e 's/[{}]/''/g' | 
    awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}'

Вышеприведенный код разбивает JSON на поля, например:

% ...
"geo_enabled":false
"friends_count":245
"profile_text_color":"000000"
"status":"in_reply_to_screen_name":null
"source":"web"
"truncated":false
"text":"My status"
"favorited":false
% ...

Как напечатать определенное поле (обозначается -v k=text)?

Ответы [ 36 ]

2 голосов
/ 22 июня 2016

Я использовал это для извлечения длительности видео из вывода ffprobe json:

MOVIE_INFO=`ffprobe "path/to/movie.mp4"  -show_streams -show_format -print_format json -v quiet` 
MOVIE_SECONDS=`echo "$MOVIE_INFO"|grep -w \"duration\" |tail -1 | cut -d\" -f4 |cut -d \. -f 1`

может использоваться для извлечения значения из любого json:

value=`echo "$jsondata"|grep -w \"key_name\" |tail -1 | cut -d\" -f4
2 голосов
/ 25 мая 2015

Вот хороший справочник . В этом случае:

curl 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) { where = match(a[i], /\"text\"/); if(where) {print a[i]} }  }'
1 голос
/ 25 марта 2019

Мне нужно было что-то короткое в BASH, и оно работало бы без зависимостей, кроме стандартных Linux LSB и Mac OS, для python 2.7 и 3 и обрабатывало ошибки, например. сообщит об ошибках синтаксического анализа json и об отсутствующих свойствах без исключений python:

json-extract () {
  if [[ "$1" == "" || "$1" == "-h" || "$1" == "-?" || "$1" == "--help" ]] ; then
    echo 'Extract top level property value from json document'
    echo '  Usage: json-extract <property> [ <file-path> ]'
    echo '  Example 1: json-extract status /tmp/response.json'
    echo '  Example 2: echo $JSON_STRING | json-extract-file status'
    echo '  Status codes: 0 - success, 1 - json parse error, 2 - property missing'
  else
    python -c $'import sys, json;\ntry: obj = json.load(open(sys.argv[2])); \nexcept: sys.exit(1)\ntry: print(obj[sys.argv[1]])\nexcept: sys.exit(2)' "$1" "${2:-/dev/stdin}"
  fi
}
1 голос
/ 10 декабря 2012

Я сделал это, "проанализировав" ответ json для определенного значения, следующим образом:

curl $url | grep $var | awk '{print $2}' | sed s/\"//g 

Ясно, что $ url здесь будет URL-адресом твиттера, а $ var будет "текстом", чтобы получить ответ для этой переменной.

На самом деле, я думаю, что единственное, что я делаю, - это опущенная строка - grep для строки с конкретной переменной, которую он ищет. Awk берет второй элемент в строке, и с помощью sed я убираю кавычки.

Кто-то умнее меня, вероятно, мог бы подумать с помощью awk или grep.

Теперь вы можете сделать все это с помощью sed:

curl $url | sed '/text/!d' | sed s/\"text\"://g | sed s/\"//g | sed s/\ //g

Таким образом, нет awk, нет grep ... Я не знаю, почему я не думал об этом раньше. Ммм ...

1 голос
/ 13 августа 2018

Вы можете использовать bashJson

Это оболочка для json-модуля Python и может обрабатывать сложные данные json.

Давайте рассмотрим этот пример данных JSON из файла test.json

{
    "name":"Test tool",
    "author":"hack4mer",
    "supported_os":{
        "osx":{
            "foo":"bar",
            "min_version" : 10.12,
            "tested_on" : [10.1,10.13]
        },
        "ubuntu":{
            "min_version":14.04,
            "tested_on" : 16.04
        }
    }
}

Следующие команды читают данные из этого json-файла примера

. /bashjson.sh test.json name

Отпечатки: тестовый инструмент

./bashjson.sh test.json supported_os osx foo

Отпечатки: бар

./bashjson.sh test.json supported_os osx tested_on

Отпечатки: [10.1,10.13]

1 голос
/ 12 февраля 2018

Niet - это инструмент, который поможет вам извлечь данные из файла json или yaml непосредственно в CLI оболочки / bash.

$ pip install niet

Рассмотрим файл json с именем project.json со следующим содержимым:

{
  project: {
    meta: {
      name: project-sample
    }
}

Вы можете использовать niet вот так:

$ PROJECT_NAME=$(niet project.json project.meta.name)
$ echo ${PROJECT_NAME}
project-sample
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...