Вопрос или проблема
Я пытаюсь получить статус задачи из приведенного ниже json-файла.. но при использовании awk он возвращает
{
"id": 10870,
"type": "job",
"url": "/api/v2/jobs/10870/",
"project": {
"id": 125,
"name": "[Unix] Создание снимка",
"description": "Создание снимка для ВМ",
"status": "успешно",
"scm_type": "git",
"allow_override": true
},
"project_update": {
"id": 1087,
"name": "[Unix] Создание снимка",
"description": "Создание снимка для ВМ",
"status": "успешно",
"failed": false
},
},
"created": "2024-10-04T00:12:49.036211Z",
"modified": "2024-10-04T00:12:49.285800Z",
"name": "[Unix]Создание снимка",
"description": "Создать снимок для ВМ",
"launch_type": "ручной",
"status": "успешно",
"execution_environment": 8,
"failed": false,
"started": "2024-10-04T00:12:49.584455Z",
"finished": "2024-10-04T00:16:29.866690Z",
"canceled_on": null,
"elapsed": 220.282,
}
Я пробую так, что возвращает мне 3 статуса “успешно”, хотя должен вернуть только последнее состояние статуса. Но это значение может находиться в любом месте json-файла. Я имею в виду, что оно может появиться перед другими двумя полями статуса. Я не могу использовать инструмент jq
Моя попытка
awk ‘$1 ~ /^”status”:/{print substr($2,1, lenghth($2)-1)}’ input.json
Документ, с которым вы работаете, имеет неправильный формат. Похоже, у вас есть избыточный },
на строке 20; также стандарт не позволяет ставить запятые в конце последнего элемента объекта/массива, поэтому ваш документ также использует нестандартные расширения.
Если бы вы исправили JSON так, чтобы он хотя бы валидировался как корректный (расширенный) JSON, на Perl, используя модуль JSON
(входной), вы могли бы сделать следующее:
perl -MJSON -0777e 'print(from_json(<>, {relaxed => 1}) -> {status})' input.json
% perl -MJSON -0777e 'print(from_json(<>, {relaxed => 1}) -> {status})' input.json
успешно
Ответ или решение
Для извлечения значений из JSON файла с помощью awk
, можно использовать следующий подход. Поскольку у вас возвращаются несколько значений статуса, вам необходимо отфильтровать их и получить только последнее значение. Однако следует отметить, что awk
не является идеальным инструментом для работы с JSON, поскольку этот формат данных иерархичен и сложен для обработки.
Тем не менее, вот как можно сделать это с помощью awk
, если вы хотите исключить jq
и другие инструменты:
-
Исправление JSON: Прежде всего, убедитесь, что ваш JSON-файл корректен. Ваша структура имеет лишнюю запятую перед закрывающей скобкой "}". Исправьте это:
{ "id": 10870, "type": "job", "url": "/api/v2/jobs/10870/", "project": { "id": 125, "name": "[Unix] Snapshot Create", "description": "Snapshot creation for VM", "status": "successful", "scm_type": "git", "allow_override": true }, "project_update": { "id": 1087, "name": "[Unix] Snapshot Create", "description": "Snapshot creation for VM", "status": "successful", "failed": false }, "created": "2024-10-04T00:12:49.036211Z", "modified": "2024-10-04T00:12:49.285800Z", "name": "[Unix]Create Snapshot", "description": "Create snapshot for VM", "launch_type": "manual", "status": "successful", "execution_environment": 8, "failed": false, "started": "2024-10-04T00:12:49.584455Z", "finished": "2024-10-04T00:16:29.866690Z", "canceled_on": null, "elapsed": 220.282 }
-
Использование
awk
для извлечения статуса:
Вы можете использовать следующий однострочныйawk
скрипт, чтобы получить последнее значение статуса:awk -F'"' '/"status"/{status=$4} END{print status}' input.json
Этот скрипт:
- Устанавливает разделитель полей
-F
на двойную кавычку (") - Находит строки, содержащие
"status"
, и сохраняет значение статуса в переменнуюstatus
- В блоке
END
выводит последнее значениеstatus
, которое сохранено.
- Устанавливает разделитель полей
Этот подход, хотя и работает, рекомендуется использовать более подходящие инструменты, такие как jq
для работы с JSON. Но если вам нужно использовать именно awk
и у вас ограниченные возможности, вышеуказанный метод поможет получить необходимое значение.