Анализ значений между значениями в двойных кавычках из списка json, загруженного через curl

#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 Не могли бы вы написать полную команду, пожалуйста?