🐧 Как конвертировать JSON в CSV с помощью шелла Linux / Unix

by itisgood

Сегодня я расскажу о распространенной проблеме, с которой сталкиваются многие системные администраторы и разработчики Linux или Unix.

Как правило, современные приложения и устройства безопасности сильно зависят от API и списков, которые предоставляют данные в формате JSON.

Например, список спамботов или VPN CIDR или хороший список проверенных IP CIDR ботов – в формате JSON.

Если устройство принимает формат JSON, вы можете взять этот список и загрузить его в свой маршрутизатор или WAF.

К сожалению, не все устройства принимают формат JSON.

Поэтому мы можем взять формат JSON и преобразовать его в формат CSV в соответствии с нашими потребностями.

Что такое форматы JSON и CSV?

JSON – это сокращение от JavaScript Object Notation.

Часто используется в веб-приложениях, но не ограничивается только JavaScript.

Можно использовать любой язык программирования, например Perl, Python или инструменты CLI, такие как jq.

☠ Как анализировать и вывести JSON с помощью инструментов командной строки Linux

CSV – это аббревиатура от Comma-separated values. Это текстовый файл, который можно использовать в электронных таблицах, языках программирования и многих других приложениях.

Пример формата JSON

Здесь показаны результаты команды df в формате JSON:

[
  {
    "fs": "/dev/mapper/vgubuntu-root",
    "type": "ext4",
    "size": "915G",
    "used": "135G",
    "avail": "734G",
    "usedpercentage": "16%",
    "mounted": "/"
  },
  {
    "fs": "/dev/nvme0n1p2",
    "type": "ext4",
    "size": "1.4G",
    "used": "378M",
    "avail": "939M",
    "usedpercentage": "29%",
    "mounted": "/boot"
  },
  {
    "fs": "/dev/nvme0n1p1",
    "type": "vfat",
    "size": "511M",
    "used": "30M",
    "avail": "482M",
    "usedpercentage": "6%",
    "mounted": "/boot/efi"
  }
]

Пример формата CSV

JSON выводится в формате CSV (все значения разделяются запятой , значение):

/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,/
/dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot
/dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi

Преобразование JSON в CSV с помощью оболочки Linux / Unix
Как же преобразовать такой ввод? Ответ заключается в использовании утилит командной строки jq или dasel.

Установка jq

Поскольку jq доступен в большинстве распространенных репозиториев, я буду использовать его.

Вот как установить jq на Debian или Ubuntu Linux с помощью команды apt command/apt-get:

sudo apt install jq

Пользователи RHEL/Fedora/CentOS/Alma/Rocky Linux попробуйте выполнить команду dnf:

sudo dnf install jq

Пользователь Alpine Linux попробуйте использовать команду apk:

sudo apk add jq

Пользователи SUSE или OpenSUSE Linux попробуйте воспользоваться командой zypper:

sudo zypper in jq

Пользователи macOS / OS X установите homebrew, а затем используйте команду brew:

brew install jq

Пример – преобразование JSON в CSV под Linux

Синтаксис такой же, как и для df.json:

cat df.json | jq

Теперь извлечем поле fs, выполним:

cat df.json | jq '.[] | .fs'

Как насчет полей fs и type?

cat df.json | jq '.[] | .fs, .type'

Чтобы создать CSV-файл с запятой в качестве разделителя, используйте следующий синтаксис:

cat df.json | jq '.[]| join(",")'

join(“,”) объединяет массив элементов, заданных в качестве входных данных, используя аргумент , в качестве разделителя:

Как преобразовать файл JSON в CSV?

Рассмотрим следующий файл, отображенный с помощью команды bat/cat

"/dev/mapper/vgubuntu-root,ext4,915G,135G,734G,16%,/"
"/dev/nvme0n1p2,ext4,1.4G,378M,939M,29%,/boot"
"/dev/nvme0n1p1,vfat,511M,30M,482M,6%,/boot/efi"

Передайте параметр -r raw, чтобы избавиться от двойных кавычек:

cat df.json | jq -r '.[]| join(",")'

Как преобразовать файл JSON в CSV?

Рассмотрим следующий файл, отображенный с помощью команды bat/cat:

cat bingbot.json
batcat bingbot.json

Образец конфигурации:

{
  "creationTime": "2021-11-10T10:00:00.121331",
  "prefixes": [
    {"ipv4Prefix": "157.55.39.0/24"},
    {"ipv4Prefix": "207.46.13.0/24"},
    {"ipv4Prefix": "40.77.167.0/24"},
    {"ipv4Prefix": "13.66.139.0/24"},
    {"ipv4Prefix": "13.66.144.0/24"},
    {"ipv4Prefix": "52.167.144.0/24"},
    {"ipv4Prefix": "13.67.10.16/28"},
    {"ipv4Prefix": "13.69.66.240/28"},
    {"ipv4Prefix": "13.71.172.224/28"},
    {"ipv4Prefix": "139.217.52.0/28"},
    {"ipv4Prefix": "191.233.204.224/28"},
    {"ipv4Prefix": "20.36.108.32/28"},
    {"ipv4Prefix": "20.43.120.16/28"},
    {"ipv4Prefix": "40.79.131.208/28"},
    {"ipv4Prefix": "40.79.186.176/28"},
    {"ipv4Prefix": "52.231.148.0/28"},
    {"ipv4Prefix": "51.8.235.176/28"},
    {"ipv4Prefix": "51.105.67.0/28"}
  ]
}

Конечной целью является создание файла .CSV следующего вида: для WAF:

157.55.39.0/24,BingBot
207.46.13.0/24,BingBot
40.77.167.0/24,BingBot
13.66.139.0/24,BingBot
13.66.144.0/24,BingBot
52.167.144.0/24,BingBot
13.67.10.16/28,BingBot
13.69.66.240/28,BingBot
13.71.172.224/28,BingBot
139.217.52.0/28,BingBot
191.233.204.224/28,BingBot
20.36.108.32/28,BingBot
20.43.120.16/28,BingBot
40.79.131.208/28,BingBot
40.79.186.176/28,BingBot
52.231.148.0/28,BingBot
51.8.235.176/28,BingBot
51.105.67.0/28,BingBot

Команды

Для получения префиксов CIDR сначала введите следующее:

cat bingbot.json | jq '.prefixes[]'

Затем передайте выходные данные для создания нового JSON для добавления поля комментария:

cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"}'

Наконец, используйте функцию join() для создания файла .CSV:

cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"} | join(",")'

Сохраните его:

cat bingbot.json | jq -r '.prefixes[] | {cidr: .ipv4Prefix, comment: "BingBot"} | join(",")' > bingbot.csv

Проверьте:

cat bingbot.csv

Заключение

Вот как я преобразовал файл CIDR в формат .CSV.

После преобразования я загружаю файл .CSV в WAF.

Этот процесс автоматизирован с помощью сценария оболочки и API для ежедневного обновления списка, чтобы WAF пропускал ботов MS bing, не блокируя их.

Я использовал jq вместо dasel, потому что знаком с синтаксисом jq, но можно использовать и dasel.

Также прочитайте страницу руководства по jq с помощью команды man или команды help:

man jq

см. также:

 

You may also like

Leave a Comment