Парсинг JSON с инструментами Unix

Обратите внимание, что вы получаете простое предупреждение.

Спецификатор преобразования "%p" для printf ожидает аргумент void*; pt1 имеет тип int*.

Предупреждение хорошо, потому что int* и void* могут, при странных реализациях, иметь разные размеры или битовые шаблоны или что-то .

Преобразуйте int* в void* с актом ...

printf("%p\n", (void*)pt1);

... и все будет хорошо даже в странных реализациях.

791
задан codeforester 30 August 2018 в 05:49
поделиться

4 ответа

Существует ряд инструментов, специально разработанных для манипулирования JSON из командной строки, которые будут намного проще и надежнее, чем делать это с Awk, например jq:

curl -s 'https://api.github.com/users/lambda' | jq -r '.name'

Вы также можете сделать это с помощью инструментов, которые, вероятно, уже установлены в вашей системе, например, Python, используя json модуль , и таким образом избежать любых дополнительных зависимостей, при этом имея преимущество правильного парсера JSON. Следующее предположение, что вы хотите использовать UTF-8, в котором должен быть закодирован оригинальный JSON и который используется большинством современных терминалов:

Python 2:

export PYTHONIOENCODING=utf8
curl -s 'https://api.github.com/users/lambda' | \
    python -c "import sys, json; print json.load(sys.stdin)['name']"

Python 3:

curl -s 'https://api.github.com/users/lambda' | \
    python3 -c "import sys, json; print(json.load(sys.stdin)['name'])"

Исторические примечания

Этот ответ изначально рекомендовал jsawk, который все еще должен работать, но немного более громоздкий в использовании, чем jq, и зависит от устанавливаемого автономного JavaScript-интерпретатора, который менее распространен, чем Python-интерпретатор, так что приведенные выше ответы, вероятно, предпочтительнее:

curl -s 'https://api.github.com/users/lambda' | jsawk -a 'return this.name'

В этом ответе также изначально использовался API Twitter из вопроса, но этот API больше не работает, что затрудняет копирование примеров для тестирования, а новый API Twitter требует клавиш API, поэтому я перешел на использование GitHub API, который можно легко использовать без клавиш API. Первым ответом на исходный вопрос будет:

curl 'http://twitter.com/users/username.json' | jq -r '.text'
976
ответ дан 22 November 2019 в 21:19
поделиться

вот один из способов сделать это с помощью awk

curl -sL 'http://twitter.com/users/username.json' | awk -F"," -v k="text" '{
    gsub(/{|}/,"")
    for(i=1;i<=NF;i++){
        if ( $i ~ k ){
            print $i
        }
    }
}'
4
ответ дан 22 November 2019 в 21:19
поделиться

Используйте поддержку JSON Python вместо использования awk!

Примерно так:

curl -s http://twitter.com/users/username.json | \
    python -c "import json,sys;obj=json.load(sys.stdin);print obj['name'];"
97
ответ дан 22 November 2019 в 21:19
поделиться

Вы спрашивали, как прострелить себе ногу, а я здесь, чтобы предоставить патроны:

curl -s 'http://twitter.com/users/username.json' | sed -e 's/[{}]/''/g' | awk -v RS=',"' -F: '/^text/ {print $2}'

Вы можете использовать tr -d '{}' вместо sed . Но их полное исключение, похоже, также дает желаемый эффект.

Если вы хотите убрать внешние кавычки, перенаправьте результат вышеуказанного через sed 's / \ (^ "\ |" $ \ ) // g '

Я думаю, что другие забили достаточную тревогу. Я буду ждать с мобильным телефоном, чтобы вызвать скорую. Пожарьте, когда будете готовы.

57
ответ дан 22 November 2019 в 21:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: