Bash grep JSON Response - PullRequest
       6

Bash grep JSON Response

0 голосов
/ 25 апреля 2019

Вот ответ JSON в файле, а именно: RGLogin.json

{"response":{"session_id":"2d48cc11ceabf28c9e92f4b677337dcd"},"response_status":200,"response_details":null}

Приведенная ниже команда grep может восстановить session_id

grep -m1 -oP '\s*"session_id"\s*:\s*"\K[^"]+' RGLogin.json

Но следующая команда grep не может получить response_status

grep -m1  -oP '\s*"response_status"\s*:\s*"\K[^"]+' RGLogin.json

Ответы [ 4 ]

3 голосов
/ 25 апреля 2019

идеологически, правильным способом решения таких вопросов будет использование инструментов, которые знают о формате данных.То есть, если это JSON, то следует использовать инструмент с поддержкой json (а инструменты с линейной поддержкой, такие как grep, следует использовать для линейных / не вложенных структур данных).

Например, для вашей структуры JSON, чтобы извлечьнеобходимая информация с использованием инструмента Unix Walk-Path для JSON: jtc:

bash $ <RGLogin.json jtc -w'[response_status]'
200
bash $ 

Раскрытие информации: я создатель инструмента jtc

2 голосов
/ 25 апреля 2019

Для идентификатора сеанса он ищет кавычки.Для статуса ответа это не указано.

grep -m1  -oP '\s*"response_status"\s*:\s*\K[^,]+' RGLogin.json
1 голос
/ 25 апреля 2019

grep не подходит для анализа JSON. Используйте вместо:

$ jq -r '.response_status' RGLogin.json
200
$
$ jq -r '.response.session_id' RGLogin.json
2d48cc11ceabf28c9e92f4b677337dcd
$
$jq -r '.response.session_id, .response_status' RGLogin.json
2d48cc11ceabf28c9e92f4b677337dcd
200
1 голос
/ 25 апреля 2019

В дополнение к ответу @ Dmitry

Я всегда использую интерпретатор php для анализа данных json. Но возможны и другие языки сценариев. Вот мое решение bash / php для получения обоих значений:

#!/bin/bash

# define json string (get it from source)
json='{"response":{"session_id":"2d48cc11ceabf28c9e92f4b677337dcd"},"response_status":200,"response_details":null}'

# execute php script and eval the results
eval $( php <<- __EOT__
        <?PHP
        # php dollar sign must be escaped
        \$data = json_decode('$json');

        # print results in bash set-var format
        printf("session_id=\"%s\"\nresponse_status=\"%s\"\n",
                \$data->response->session_id,
                \$data->response_status );
        ?>
        # end-of-text marker must be placed at first column, 
        # or can be indented by real TABS (not SPACES).
__EOT__
        )

# show params in bash
echo "session_id      : $session_id"
echo "response_status : $response_status"

И вывод:

session_id      : 2d48cc11ceabf28c9e92f4b677337dcd
response_status : 200
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...