У меня есть этот текст JSON:
{
"buildStatus" : {
"status" : "ERROR",
"conditions" : [{
"status" : "OK",
"metricKey" : "bugs"
}, {
"status" : "ERROR",
"metricKey" : "test_success_density"
}, {
"status" : "OK",
"metricKey" : "vulnerabilities"
}
],
"periods" : []
}
}
Я хочу извлечь общее состояние buildStatus, т.е. ожидаемый результат был "ОШИБКА"
"buildStatus" : {
"status" : "ERROR",
....
}
Я попробовал выражение sed ниже, но оно не работает, оно возвращает OK
:
status= sed -E 's/.*\"buildStatus\":.*\"status\":\"([^\"]*)\",.*/\1/' jsonfile
Что я делаю неправильно?
источник
jq
:jq -r .buildStatus.status
Работа для
jq
:Можно сократить до:
-r
(--raw-output
) выводит строку безjson
форматирования строки, т.е. без кавычек.Пример:
Если он еще не установлен, установите его с помощью (доступно в репозитории Universe):
источник
Как уже упоминалось, синтаксический анализ сложных структурированных данных предпочтительнее с соответствующим API. В Python есть
json
модуль для этого, который я лично очень часто использую в своих скриптах, и довольно просто извлечь нужные поля, как вы:Здесь происходит то, что мы перенаправляем входной файл в стандартный ввод python и читаем его с помощью
json.load()
. Это становится словарем Python с ключом «buildStatus», и он содержит другой словарь Python с ключом «status». Таким образом, мы просто распечатываем значение ключа в словаре, который хранится в другом словаре. Довольно просто.Помимо простоты, еще одним преимуществом является то, что Python и этот API все предустановлены и поставляются с Ubuntu по умолчанию.
источник
Вы можете сделать это на самом деле
sed
, но я настоятельно призываю вас использовать более сложный язык с инструментами, написанными для обработки данных JSON. Вы можете попробовать Perl или Python, например.Теперь, в вашем простом примере, все, что вам нужно, это первое вхождение
"status"
, так что вы можете сделать:Хитрость заключается в том,
-n
чтобы избежать печати, а затем, если строка соответствуетstatus
(/status/
), вы удаляете все, кроме части, которую хотитеs/.*:\s*"(.*)",/\1/
,p
набираете строку иq
удаляете.Лично я нахожу эту эквивалентную команду grep намного проще:
Или этот:
Если серьезно, если вы планируете анализ файлов JSON, не пытайтесь делать это вручную. Используйте правильный анализатор JSON.
источник
grep -m 1 status file.json | tr -cd '[[:alnum:]]:' | cut -f2 -d':'
Не говорю, что вы должны использовать
sed
(я думаю, что кто-то отказался от меня только за то, что я не написал обязательное предостережение), но, если вам нужно найти что-то в следующей строке,buildStatus
как вы, похоже, пытаетесь в своей собственной попытке, вам нужно сказать,sed
чтобы прочитать следующая строка сN
командойПримечания:
-n
не печатайте ничего, пока мы не попросим об этом-r
использовать ERE (так же, как-E
)/buildStatus/N
найдите этот шаблон и прочитайте следующую строкуs/old/new/
заменитьold
наnew
.*
любое количество любых символов в строке\n
новая линия: "(.*)",
сохранить любые символы между: "
и",
\1
обратная ссылка на сохраненный шаблонp
распечатать часть, над которой мы работалиисточник
Существует типичное объяснение того, почему
sed
и аналогичные инструменты обработки текстового потока плохо оснащены для анализа структурированных данных, таких как JSON и XML. У меня нет этого под рукой, но он есть, и я считаю, что смысл в том, что выражения, необходимые во всех ситуациях, за исключением, вероятно, наименьшего количества, быстро становятся очень сложными, в то время как альтернативные инструменты, созданные специально для анализа структуры, более элегантный, читаемый и эффективный при том же разборе.Как Муру написал в комментарии ,
jq
должен быть правильный инструмент для работы. Я также могу ручаться за то, что он лично очень взволнован, увидев, что он заменил несколько раз, когда я пытался проанализировать одни и те же данные, но почти безуспешно или безуспешно. Он даже содержит большое количество возможностей для форматирования и иного управления выводом. Я предпочитаю это поjsontool
причине или более, что я в настоящее время забываю.Byte Commander, похоже, рекомендует
jshon
в другом ответе . Я не использовал этот инструмент, но он напоминает мнеxmlstarlet
и его синтаксис, а также некоторые настраиваемые представления для вывода.источник
jsontool
его можно использовать для конкретного случая ОПjq
чтобы Муру и Химэйл описали уже существующие примеры, и просто опубликовал обоснование этого: askubuntu.com/a/863948/230721Еще один инструмент Json под названием json ( https://github.com/trentm/json )
Это тематическое исследование вводит в заблуждение: похоже, инструменты не работают. Вы также можете использовать
json
для изменения файлов JSON:или даже...
документация в: http://trentm.com/json/
если не установлен:
npm install -g json
источник