#json #bash #parsing #curl
Вопрос:
У меня есть онлайн-файл JSON. Каждый раз, когда я пытаюсь его загрузить. Но мне нужно проанализировать этот JSON и получить IP-адреса в Интернете между двойными кавычками. Обычно я могу проанализировать его с помощью jq,например .sample[].echo и т. Д., Но мой список больше, чем этот пример1, 2..300, В нем хранится более 300 данных блоков. Мне нужно проанализировать и получить только внутри двойных кавычек и получить все ip-адреса.
Кстати: я видел много вопросов по стековеру, но ни один из них не касался фильтрации такого рода входных данных
curl -L "https://sample.data.com/ip.json" -o 'ip.json' | *need to parsing method here*
Вот мой файл JSON:
{
"sample1": {
"echo": [
"255.254.253.0/32"
],
"delta": [
"199.231.211.0/32"
]
},
"sample2": {
"beta": [
"250.123.124.0/32"
],
"pre": [
"122.156.243.0/32"
]
},
.
.
.
.
.
}
Комментарии:
1. Вы пробовали
jq '.[][]'
(илиjq '.. | strings'
)?2. @oguzismail не пробовал этого. Я изменил ваш ответ, и он сработал. jq -r ‘.[][][]’ это сработало.
curl -s "https://sample.data.com/ip.json" | jq -r '.[][][]' > ip.json
Ответ №1:
Если вы хотите извлечь все строки, которые выглядят как IP-адрес, вы все равно можете использовать jq
. Если мы «исправим» ваш пример JSON выше, чтобы он был фактическим JSON, затем запустим следующую программу jq:
.. | strings | match("\d \.\d \.\d \.\d (?:/\d )?").string
над этим был бы вывод:
"255.254.253.0/32"
"199.231.211.0/32"
"250.123.124.0/32"
"122.156.243.0/32"
Я предполагаю, что вы не хотите, чтобы IP-адреса оставались в очереди, это можно обработать с -r
помощью флага вывода
$ curl ... | jq -r '.. | strings | match("\d \.\d \.\d \.\d (?:/\d )?").string'
255.254.253.0/32
199.231.211.0/32
250.123.124.0/32
122.156.243.0/32
Комментарии:
1.Я нашел ответ с помощью вышеприведенной команды, но мне также любопытно, как вы это сделаете. Я пробовал по-твоему, но сделал ли я что-то не так? потому что я мог получить любую значимую вещь.
curl -L "https://sample.data.com/ip.json" -o 'ip.json' | jq -r | strings | match("\d \.\d \.\d \.\d (?:/\d )?").string
curl -L "https://sample.data.com/ip.json" -o 'ip.json' | strings | match("\d \.\d \.\d \.\d (?:/\d )?").string
Обе попытки я получаю :bash: syntax error near unexpected token
«\d \.\d \.\d \.\d (?:/\d )?»»2. @hammer89 Почему вы удалили кавычки? А
..
что ?3.
"255.254.253.0/32", "199.231.211.0/32", "250.123.124.0/32", "122.156.243.0/32"
Можем ли мы так поступить?4. @hammer89 Если вы хотите вывести массив, то оберните вывод в один:
jq '[.. | strings | ....]
5. перед упаковкой массива. Я все еще не мог правильно выполнить ваш ответ, все еще получая синтаксическую ошибку с этой командой.
curl -L "https://sample.data.com/ip.json" -o 'ip.json' | strings | match("\d \.\d \.\d \.\d (?:/\d )?").string
Не могли бы вы написать полную команду, пожалуйста?