Ознакомьтесь с документацией пакета
jc
Python для разработчиков.
Попробуйте веб-демонстрацию
jc
и REST API.
jc
доступен как плагин фильтра Ansible в коллекцииcommunity.general
. См. этот пост в блоге для примера.
Преобразование JSON
jc
JSON преобразует выходные данные многих инструментов CLI, типов файлов и общих строк для упрощения анализа в сценариях. См. раздел «Парсеры» для получения информации о поддерживаемых командах, типах файлов и строках.
dig example.com | jc --dig
[{ "id" : 38052 , "opcode" : " QUERY " , "status" : " NOERROR " , "flags" :[ " qr " , " rd " , " ra " ],
"query_num" : 1 , "answer_num" : 1 , "authority_num" : 0 , "additional_num" : 1 ,
"opt_pseudosection" :{ "edns" :{ "version" : 0 , "flags" :[], "udp" : 4096 }}, "question" :
{ "name" : " example.com. " , "class" : " IN " , "type" : " A " }, "answer" :[{ "name" :
" example.com. " , "class" : " IN " , "type" : " A " , "ttl" : 39049 , "data" : " 93.184.216.34 " }],
"query_time" : 49 , "server" : " 2600:1700:bab0:d40::1#53(2600:1700:bab0:d40::1) " ,
"when" : " Fri Apr 16 16:09:00 PDT 2021 " , "rcvd" : 56 , "when_epoch" : 1618614540 ,
"when_epoch_utc" : null }]
Это позволяет осуществлять дальнейшую обработку вывода в командной строке с помощью таких инструментов, как jq
или jello
путем передачи команд:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
или используя альтернативный «магический» синтаксис:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
также можно использовать как библиотеку Python. В этом случае возвращаемым значением будет словарь Python, список словарей или даже ленивая итерация словарей вместо JSON:
> >> import subprocess
> >> import jc
> >>
>> > cmd_output = subprocess . check_output ([ 'dig' , 'example.com' ], text = True )
> >> data = jc . parse ( 'dig' , cmd_output )
> >>
>> > data [ 0 ][ 'answer' ]
[{ 'name' : 'example.com.' , 'class' : 'IN' , 'type' : 'A' , 'ttl' : 29658 , 'data' :
'93.184.216.34' }]
Для получения документации по пакету
jc
Python используйтеhelp('jc')
,help('jc.lib')
или просмотрите онлайн-документацию.
Доступны два представления данных. Представление по умолчанию использует строгую схему для каждого синтаксического анализатора и преобразует известные числа в значения JSON int/float. Определенные известные значения None
преобразуются в JSON null
, преобразуются известные логические значения, а в некоторых случаях добавляются дополнительные поля семантического контекста.
Чтобы получить доступ к необработанному, предварительно обработанному JSON, используйте опцию -r
cli или параметр функции raw=True
в parse()
при использовании jc
в качестве библиотеки Python.
Схемы для каждого парсера можно найти по ссылке на документацию рядом с каждым парсером ниже.
Примечания к выпуску можно найти в разделе «Релизы» на Github.
Для получения дополнительной информации о мотивах этого проекта, пожалуйста, прочтите мою публикацию в блоге «Привнесение философии Unix в 21 век» и мое интервью с Console.
См. также:
Варианты использования:
Есть несколько способов получить jc
. Вы можете установить его через pip
, репозитории пакетов ОС или загрузив правильный двоичный файл для вашей архитектуры и запустив его в любом месте вашей файловой системы.
pip3 install jc
ОС | Команда |
---|---|
Дебиан/Убунту Линукс | apt-get install jc |
Федора Linux | dnf install jc |
openSUSE Linux | zypper install jc |
Арка Linux | pacman -S jc |
НикОС Linux | nix-env -iA nixpkgs.jc или nix-env -iA nixos.jc |
Система Guix Linux | guix install jc |
Генту Линукс | emerge dev-python/jc |
Фотон Linux | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Плагин Ansible-фильтра | ansible-galaxy collection install community.general |
Разъем FortiSOAR | Установите из FortiSOAR Connector Marketplace. |
Дополнительные пакеты ОС см. на странице https://repology.org/project/jc/versions.
Предварительно скомпилированные двоичные файлы см. в разделе «Релизы» на Github.
jc
принимает входные данные по конвейеру из STDIN
и выводит JSON-представление выходных данных предыдущей команды в STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
В качестве альтернативы можно использовать «магический» синтаксис, добавив jc
к преобразуемой команде или перед абсолютным путем для файлов Proc. Параметры можно передать jc
непосредственно перед указанием пути к файлу команды или процедуры. (Примечание: псевдонимы команд и встроенные функции оболочки не поддерживаются)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
Вывод JSON может быть компактным (по умолчанию) или иметь красивый формат с помощью опции -p
.
Аргумент | Команда или тип файла | Документация |
---|---|---|
--acpi | анализатор команд acpi | подробности |
--airport | airport -I команду парсера | подробности |
--airport-s | парсер команды airport -s | подробности |
--apt-cache-show | apt-cache show синтаксический анализатор команд | подробности |
--apt-get-sqq | анализатор команд apt-get -sqq | подробности |
--arp | анализатор arp -команд | подробности |
--asciitable | Анализатор таблиц ASCII и Unicode | подробности |
--asciitable-m | многострочный анализатор таблиц ASCII и Unicode | подробности |
--blkid | анализатор команд blkid | подробности |
--bluetoothctl | синтаксический анализатор команд bluetoothctl | подробности |
--cbt | синтаксический анализатор команд cbt (Google Bigtable) | подробности |
--cef | Синтаксический анализатор строк CEF | подробности |
--cef-s | Анализатор потоковой передачи строк CEF | подробности |
--certbot | анализатор команд certbot | подробности |
--chage | парсер команды chage --list | подробности |
--cksum | анализатор команд cksum и sum | подробности |
--clf | Анализатор файлов общего и комбинированного формата журналов | подробности |
--clf-s | Анализатор потоковой передачи файлов общего и комбинированного формата журналов | подробности |
--crontab | команда crontab и анализатор файлов | подробности |
--crontab-u | парсер файлов crontab с поддержкой пользователей | подробности |
--csv | Парсер CSV-файлов | подробности |
--csv-s | Анализатор потоковой передачи CSV-файлов | подробности |
--curl-head | парсер команды curl --head | подробности |
--date | анализатор команд date | подробности |
--datetime-iso | Синтаксический анализатор строк даты и времени ISO 8601 | подробности |
--debconf-show | анализатор команд debconf-show | подробности |
--df | анализатор команд df | подробности |
--dig | анализатор команд dig | подробности |
--dir | парсер команды dir | подробности |
--dmidecode | анализатор команд dmidecode | подробности |
--dpkg-l | dpkg -l анализатор команд | подробности |
--du | парсер команд du | подробности |
--efibootmgr | анализатор команд efibootmgr | подробности |
--email-address | Анализатор строки адреса электронной почты | подробности |
--env | анализатор команд env | подробности |
--ethtool | анализатор команд ethtool | подробности |
--file | анализатор file команд | подробности |
--find | find парсер команд | подробности |
--findmnt | анализатор команд findmnt | подробности |
--finger | анализатор команд finger | подробности |
--free | free парсер команд | подробности |
--fstab | парсер файлов /etc/fstab | подробности |
--git-log | анализатор команд git log | подробности |
--git-log-s | анализатор потоковой передачи команд git log | подробности |
--git-ls-remote | анализатор команд git ls-remote | подробности |
--gpg | gpg --with-colons анализатор команд | подробности |
--group | парсер файлов /etc/group | подробности |
--gshadow | парсер файлов /etc/gshadow | подробности |
--hash | анализатор hash команд | подробности |
--hashsum | анализатор команд hashsum ( md5sum , shasum и т. д.) | подробности |
--hciconfig | анализатор команд hciconfig | подробности |
--history | анализатор команд history | подробности |
--host | анализатор команд host | подробности |
--hosts | парсер файлов /etc/hosts | подробности |
--http-headers | Парсер HTTP-заголовков | подробности |
--id | id команд id | подробности |
--ifconfig | анализатор команд ifconfig | подробности |
--ini | парсер INI-файлов | подробности |
--ini-dup | INI с парсером файлов дубликатов ключей | подробности |
--iostat | анализатор команд iostat | подробности |
--iostat-s | анализатор потоковой передачи команд iostat | подробности |
--ip-address | Анализатор строк адресов IPv4 и IPv6 | подробности |
--ipconfig | ipconfig синтаксический анализатор команд Windows | подробности |
--iptables | анализатор команд iptables | подробности |
--ip-route | анализатор команд ip route | подробности |
--iw-scan | iw dev [device] scan | подробности |
--iwconfig | анализатор команд iwconfig | подробности |
--jar-manifest | Анализатор файлов Java MANIFEST.MF | подробности |
--jobs | анализатор команд jobs | подробности |
--jwt | Анализатор строк JWT | подробности |
--kv | Файл ключей/значений и анализатор строк | подробности |
--kv-dup | Ключ/значение с дубликатом файла ключа и анализатором строк | подробности |
--last | анализатор команд last и lastb | подробности |
--ls | анализатор команд ls | подробности |
--ls-s | анализатор потоковой передачи команд ls | подробности |
--lsattr | анализатор команд lsattr | подробности |
--lsb-release | анализатор команд lsb_release | подробности |
--lsblk | анализатор команд lsblk | подробности |
--lsmod | анализатор команд lsmod | подробности |
--lsof | анализатор команд lsof | подробности |
--lspci | анализатор команд lspci -mmv | подробности |
--lsusb | анализатор команд lsusb | подробности |
--m3u | Парсер файлов M3U и M3U8 | подробности |
--mdadm | анализатор команд mdadm | подробности |
--mount | синтаксический анализатор команд mount | подробности |
--mpstat | анализатор команд mpstat | подробности |
--mpstat-s | анализатор потоковой передачи команд mpstat | подробности |
--needrestart | анализатор команды needrestart -b | подробности |
--netstat | анализатор команд netstat | подробности |
--nmcli | анализатор команд nmcli | подробности |
--nsd-control | анализатор команд nsd-control | подробности |
--ntpq | анализатор команд ntpq -p | подробности |
--openvpn | парсер файла openvpn-status.log | подробности |
--os-prober | анализатор команд os-prober | подробности |
--os-release | парсер файлов /etc/os-release | подробности |
--pacman | анализатор команд pacman | подробности |
--passwd | парсер файлов /etc/passwd | подробности |
--path | Парсер строки пути POSIX | подробности |
--path-list | Синтаксический анализатор строк списка путей POSIX | подробности |
--pci-ids | парсер файлов pci.ids | подробности |
--pgpass | Парсер файлов паролей PostgreSQL | подробности |
--pidstat | pidstat -H анализатор команд | подробности |
--pidstat-s | pidstat -H анализатор потоковой передачи команд | подробности |
--ping | анализатор команд ping и ping6 | подробности |
--ping-s | анализатор потоковой передачи команд ping и ping6 | подробности |
--pip-list | анализатор команд pip list | подробности |
--pip-show | анализатор команд pip show | подробности |
--pkg-index-apk | Анализатор файлов индекса пакетов Alpine Linux | подробности |
--pkg-index-deb | Анализатор файлов индекса пакетов Debian | подробности |
--plist | анализатор PLIST-файлов | подробности |
--postconf | анализатор команд postconf -M | подробности |
--proc | /proc/ парсер файлов | подробности |
--ps | анализатор команд ps | подробности |
--resolve-conf | парсер файла /etc/resolve.conf | подробности |
--route | анализатор команд route | подробности |
--rpm-qi | Синтаксический анализатор команд rpm -qi | подробности |
--rsync | анализатор команд rsync | подробности |
--rsync-s | анализатор потоковой передачи команд rsync | подробности |
--semver | Анализатор строк семантической версии | подробности |
--sfdisk | анализатор команд sfdisk | подробности |
--shadow | анализатор файлов /etc/shadow | подробности |
--srt | Парсер файлов SRT | подробности |
--ss | анализатор команд ss | подробности |
--ssh-conf | Конфигурационный файл ssh и анализатор команд ssh -G | подробности |
--sshd-conf | Конфигурационный файл sshd и анализатор команд sshd -T | подробности |
--stat | анализатор команд stat | подробности |
--stat-s | анализатор потоковой передачи команд stat | подробности |
--swapon | парсер команд swapon | подробности |
--sysctl | анализатор команд sysctl | подробности |
--syslog | Анализатор строк системного журнала RFC 5424 | подробности |
--syslog-s | Анализатор потоковой передачи строк Syslog RFC 5424 | подробности |
--syslog-bsd | Анализатор строк системного журнала RFC 3164 | подробности |
--syslog-bsd-s | Анализатор потоковой передачи строк Syslog RFC 3164 | подробности |
--systemctl | анализатор команд systemctl | подробности |
--systemctl-lj | анализатор команд systemctl list-jobs | подробности |
--systemctl-ls | анализатор команд systemctl list-sockets | подробности |
--systemctl-luf | Синтаксический анализатор команд systemctl list-unit-files | подробности |
--systeminfo | анализатор команд systeminfo | подробности |
--time | /usr/bin/time анализатор команд | подробности |
--timedatectl | синтаксический анализатор команды timedatectl status | подробности |
--timestamp | Синтаксический анализатор строк временных меток Unix Epoch | подробности |
--toml | Парсер TOML-файлов | подробности |
--top | парсер команды top -b | подробности |
--top-s | анализатор потоковой передачи команды top -b | подробности |
--tracepath | анализатор команд tracepath и tracepath6 | подробности |
--traceroute | анализатор команд traceroute и traceroute6 | подробности |
--tune2fs | синтаксический анализатор команды tune2fs -l | подробности |
--udevadm | анализатор команд udevadm info | подробности |
--ufw | анализатор команд ufw status | подробности |
--ufw-appinfo | ufw app info [application] анализатор команд | подробности |
--uname | uname -a анализатор команд | подробности |
--update-alt-gs | update-alternatives --get-selections синтаксический анализатор команд | подробности |
--update-alt-q | update-alternatives --query анализатор команд | подробности |
--upower | анализатор команд upower | подробности |
--uptime | анализатор команд uptime | подробности |
--url | Парсер URL-строки | подробности |
--ver | Анализатор строки версии | подробности |
--veracrypt | анализатор команд veracrypt | подробности |
--vmstat | анализатор команд vmstat | подробности |
--vmstat-s | анализатор потоковой передачи команд vmstat | подробности |
--w | w анализатор команд | подробности |
--wc | анализатор команд wc | подробности |
--wg-show | парсер команд wg show | подробности |
--who | who командует парсером | подробности |
--x509-cert | Анализатор файлов сертификатов X.509 PEM и DER | подробности |
--x509-csr | Анализатор файлов запросов сертификатов X.509 PEM и DER | подробности |
--xml | парсер XML-файлов | подробности |
--xrandr | синтаксический анализатор команд xrandr | подробности |
--yaml | Парсер YAML-файлов | подробности |
--zipinfo | анализатор команд zipinfo | подробности |
--zpool-iostat | парсер команд zpool iostat | подробности |
--zpool-status | парсер команд zpool status | подробности |
Короткий | Длинный | Описание |
---|---|---|
-a | --about | О jc . Выводит информацию о jc и парсерах (разумеется, в формате JSON или YAML!) |
-C | --force-color | Принудительный вывод цвета даже при использовании каналов (переопределяет -m и переменную env NO_COLOR ) |
-d | --debug | Режим отладки. Печатает сообщения трассировки, если возникают проблемы с синтаксическим анализом (используйте -dd для подробной отладки). |
-h | --help | Помощь. Используйте jc -h --parser_name для документации парсера. Используйте дважды, чтобы показать скрытые парсеры (например -hh ). Используйте трижды, чтобы показать категории анализатора (например, -hhh ). |
-m | --monochrome | Монохромный вывод |
-M | --meta-out | Добавьте метаданные в вывод, включая метку времени, имя парсера, магическую команду, код выхода магической команды и т. д. |
-p | --pretty | Довольно отформатировать вывод JSON |
-q | --quiet | Тихий режим. Подавляет предупреждающие сообщения парсера (используйте -qq , чтобы игнорировать ошибки парсера потоковой передачи) |
-r | --raw | Сырой вывод. Обеспечивает более буквальный вывод, обычно со строковыми значениями, без дополнительной семантической обработки. |
-s | --slurp | Объединение нескольких строк в массив. (используйте -hhh , чтобы найти совместимые парсеры) |
-u | --unbuffer | Разбуферировать вывод |
-v | --version | Информация о версии |
-y | --yaml-out | YAML-вывод |
-B | --bash-comp | Создать сценарий завершения оболочки Bash (подробнее) |
-Z | --zsh-comp | Создать сценарий завершения оболочки Zsh (подробнее) |
Нарезка строк поддерживается с использованием синтаксиса START:STOP
аналогичного нарезке строк в Python. Это позволяет вам пропускать строки в начале и/или конце ввода STDIN
, который вы хотите преобразовать jc
.
START
и STOP
могут быть положительными или отрицательными целыми числами или пустыми и позволяют указать, сколько строк пропускать и сколько строк обрабатывать. Положительные и пустые срезы наиболее эффективно используют память. Любые отрицательные целые числа в срезе будут использовать больше памяти.
Например, чтобы пропустить первую и последнюю строку следующего текста, вы можете выразить фрагмент несколькими способами:
$ cat table.txt
# ## We want to skip this header ###
col1 col2
foo 1
bar 2
# ## We want to skip this footer ###
$ cat table.txt | jc 1:-1 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
$ cat table.txt | jc 1:4 --asciitable
[{ " col1 " : " foo " , " col2 " : " 1 " },{ " col1 " : " bar " , " col2 " : " 2 " }]
В этом примере фрагменты строк 1:-1
и 1:4
обеспечивают одинаковый результат.
При использовании положительных целых чисел индекс STOP
не включается. Положительные срезы отсчитываются от первой строки входных данных к концу, начиная с 0
в качестве первой строки. Отрицательные срезы отсчитываются от последней строки к началу, начиная с -1
в качестве последней строки. Именно так работает функция нарезки Python.
Вот разбивка вариантов фрагмента строки:
Обозначение среза | Обработанные входные строки |
---|---|
START:STOP | линии START через STOP - 1 |
START: | строки START до конца вывода |
:STOP | строки от начала до STOP - 1 |
-START:STOP | Строки START от конца до STOP - 1 |
START:-STOP | линии START через STOP линии с конца |
-START:-STOP | Строки START с конца через линии STOP с конца |
-START: | START строки от конца до остальной части вывода |
:-STOP | линии с начала через STOP линии с конца |
: | все строки |
Некоторые парсеры поддерживают ввод нескольких элементов и могут выводить массив результатов за один проход. Slurping работает для анализаторов строк, которые принимают одну строку ввода. (например, url
и ip-address
). Чтобы просмотреть список парсеров, поддерживающих опцию --slurp
, используйте jc -hhh
.
Например, вы можете отправить файл с несколькими IP-адресами (по одному в строке) в jc
с опцией --slurp
, и будет выведен массив результатов:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
Магический синтаксис файлов /proc
автоматически поддерживает обработку нескольких файлов (нет необходимости использовать опцию --slurp
). Например, вы можете конвертировать множество PID-файлов одновременно:
$ jc /proc/ * /status
[ < multiple output objects > ]
Когда используется магический синтаксис /proc
и выбрано несколько файлов, в выходные данные вставляется дополнительное поле _file
, поэтому легче определить, к какому файлу относится каждый выходной объект.
Наконец, опция --meta-out
может использоваться в сочетании с выводом данных. В этом случае выпитый вывод заворачивается в объект со следующей структурой:
{
"result" : [ ],
"_jc_meta" : {
"parser" : " url " ,
"timestamp" : 1706235558.654576 ,
"slice_start" : null ,
"slice_end" : null ,
"input_list" : [
" http://www.google.com " ,
" https://www.apple.com " ,
" https://www.microsoft.com "
]
}
}
С помощью --meta-out
input_list
содержит список входных данных (фактические входные строки или имена файлов /proc
), поэтому вы можете определить, какой выходной объект относится к каждой входной строке или имени файла /proc
.
Любые фатальные ошибки внутри jc
будут генерировать код выхода 100
, в противном случае код выхода будет 0
.
При использовании «магического» синтаксиса (например, jc ifconfig eth0
), jc
сохранит код завершения анализируемой программы и добавит его к коду завершения jc
. Таким образом, легче определить, возникла ли ошибка в анализируемой программе или jc
.
Рассмотрим следующие примеры с использованием ifconfig
:
код выхода ifconfig | код выхода jc | Комбинированный код выхода | Интерпретация |
---|---|---|---|
0 | 0 | 0 | Нет ошибок |
1 | 0 | 1 | Ошибка в ifconfig |
0 | 100 | 100 | Ошибка в jc |
1 | 100 | 101 | Ошибка как в ifconfig , так и в jc |
При использовании «магического» синтаксиса вы также можете получить код завершения вызываемой программы, используя параметр --meta-out
или -M
. Это добавит к выходным данным объект _jc_meta
, который будет включать информацию о магической команде, включая код выхода.
Вот пример с ping
:
$ jc --meta-out -p ping -c2 192.168.1.252
{
" destination_ip " : " 192.168.1.252 " ,
" data_bytes " : 56,
" pattern " : null,
" destination " : " 192.168.1.252 " ,
" packets_transmitted " : 2,
" packets_received " : 0,
" packet_loss_percent " : 100.0,
" duplicates " : 0,
" responses " : [
{
" type " : " timeout " ,
" icmp_seq " : 0,
" duplicate " : false
}
],
" _jc_meta " : {
" parser " : " ping " ,
" timestamp " : 1661357115.27949,
" magic_command " : [
" ping " ,
" -c2 " ,
" 192.168.1.252 "
],
" magic_command_exit " : 2
}
}
$ echo $?
2
Вы можете указать собственные цвета через переменную среды JC_COLORS
. Переменная среды JC_COLORS
принимает четыре строковых значения, разделенных запятыми, в следующем формате:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Цвета: black
, red
, green
, yellow
, blue
, magenta
, gray
cyan
brightblack
, brightred
-красный, ярко-зеленый, brightgreen
-желтый, brightyellow
, brightblue
, brightmagenta
brightcyan
, white
или default
.
Например, чтобы установить цвета по умолчанию:
JC_COLORS=blue,brightblack,magenta,green
или
JC_COLORS=default,default,default,default
Вы можете установить для переменной среды NO_COLOR
любое значение, чтобы отключить вывод цвета в jc
. Обратите внимание, что использование параметра -C
для принудительного вывода цвета переопределяет как переменную среды NO_COLOR
, так и параметр -m
.
Большинство парсеров загружают все данные из STDIN
, анализируют их, а затем последовательно выводят весь документ JSON. Существуют некоторые потоковые анализаторы (например, ls-s
и ping-s
), которые немедленно начинают обработку и построчный вывод данных в виде строк JSON (также известных как NDJSON), пока они получены из STDIN
. Это может значительно уменьшить объем памяти, необходимый для анализа больших объемов вывода команды (например, ls -lR /
), а иногда может ускорить обработку данных. Потоковые парсеры ведут себя немного иначе, чем стандартные парсеры, как описано ниже.
Примечание. Потоковые парсеры нельзя использовать с «магическим» синтаксисом.
Возможно, вы захотите игнорировать ошибки анализа при использовании потоковых анализаторов, поскольку они могут использоваться в долгоживущих конвейерах обработки, а ошибки могут привести к поломке канала. Чтобы игнорировать ошибки синтаксического анализа, используйте опцию -qq
cli или аргумент ignore_exceptions=True
с функцией parse()
. Это добавит объект _jc_meta
к выводу JSON с атрибутом success
. Если success
true
, то проблем с разбором строки не возникло. Если success
равен false
, значит, обнаружена проблема синтаксического анализа, и будут добавлены поля error
и line
, включающие краткое описание ошибки и содержимое неразбираемой строки соответственно:
Успешно проанализирована строка с опцией -qq
:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Неудачно проанализированная строка с опцией -qq
:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
Большинство операционных систем буферизуют выходные данные, передаваемые от процесса к процессу. Буфер обычно составляет около 4 КБ. При просмотре вывода в терминале буфер ОС не задействован, поэтому вывод сразу отображается на экране. Однако при объединении нескольких процессов может показаться, что выходные данные зависают, когда входные данные очень медленные (например, ping
):
$ ping 1.1.1.1 | jc --ping-s | jq
Это связано с тем, что в этом примере ОС использует буфер размером 4 КБ между jc
и jq
. Чтобы отображать данные на терминале в реальном времени, вы можете отключить буфер с помощью опции -u
(unbuffer) cli:
$ ping 1.1.1.1 | jc --ping-s -u | jq
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
{"type":"reply","pattern":null,"timestamp":null,"bytes":"64","respons...}
...
Примечание. Небуферизованный вывод может быть медленнее для больших потоков данных.
Потоковые анализаторы принимают любой итерируемый объект и возвращают итерируемый объект, позволяющий отложенную обработку данных. Входные данные должны повторяться по строкам строковых данных. Примерами хороших входных данных являются sys.stdin
или str.splitlines()
.
Чтобы использовать возвращенный итерируемый объект в своем коде, просто пройдите по нему или используйте встроенную функцию next():
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Плагины парсера могут быть помещены в папку jc/jcparsers
в вашем локальном «каталоге данных приложения» :
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Плагины парсера представляют собой стандартные файлы модулей Python. Используйте парсер jc/parsers/foo.py
или jc/parsers/foo_s.py (streaming)
в качестве шаблона и просто поместите файл .py
в подпапку jcparsers
. Любые зависимости можно поместить в папку jc
над jcparsers
и импортировать в код парсера.
Имена файлов плагинов Parser должны быть допустимыми именами модулей Python и, следовательно, должны начинаться с буквы и полностью состоять из букв, цифр и символов подчеркивания. Локальные плагины могут переопределять парсеры по умолчанию.
Примечание. Каталог данных приложения соответствует спецификации базового каталога XDG.
Для достижения наилучших результатов установите переменные среды локали на C
или en_US.UTF-8
изменив переменную LC_ALL
:
$ LC_ALL=C date | jc --date
Вы также можете установить переменные локали индивидуально:
$ export LANG=C
$ export LC_NUMERIC=C
В некоторых старых системах вывод UTF-8 будет понижен до ASCII с escape-последовательностями \u
если языковой стандарт C
не поддерживает кодировку UTF-8.
Некоторые анализаторы добавляют к выходным данным рассчитанные поля временных меток эпохи. Если имя поля метки времени не имеет суффикса _utc
оно считается наивным. (т.е. на основе местного часового пояса системы, на которой был запущен анализатор jc
).
Если в тексте вывода команды можно определить часовой пояс UTC, временная метка будет учитывать часовой пояс и иметь суффикс _utc
в имени ключа. (например, epoch_utc
) Никакие другие часовые пояса не поддерживаются для известных временных меток.
jc
можно использовать практически в любой оболочке. Некоторые современные оболочки имеют встроенные возможности десериализации и фильтрации JSON, что делает использование jc
еще более удобным.
Например, в NGS (Next Generation Shell) возможно следующее:
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
При этом запускается jc
, анализируется выходной JSON и присваивается полученная структура данных переменной в одной строке кода.
Дополнительные примеры использования jc
в других оболочках см. на этой вики-странице.
Некоторые парсеры, такие как dig
, xml
, csv
и т. д., будут работать на любой платформе. Другие анализаторы, которые преобразуют выходные данные для конкретной платформы, будут генерировать предупреждающее сообщение, если они запускаются на неподдерживаемой платформе. Чтобы просмотреть всю информацию о парсере, включая совместимость, запустите jc -ap
.
Вы по-прежнему можете использовать парсер на неподдерживаемой платформе — например, вы можете захотеть проанализировать файл с выводом linux lsof
на ноутбуке с macOS или Windows. В этом случае вы можете подавить предупреждающее сообщение с помощью опции -q
cli или параметра функции quiet=True
в parse()
:
macOS:
cat lsof.out | jc -q --lsof
или Windows:
type lsof.out | jc -q --lsof
Протестировано на:
Не стесняйтесь добавлять/улучшать код или парсеры! Вы можете использовать парсеры jc/parsers/foo.py
или jc/parsers/foo_s.py (streaming)
в качестве шаблона и отправить свой парсер с запросом на включение.
Пожалуйста, ознакомьтесь с Руководством по участию для получения дополнительной информации.
ifconfig-parser
от KnightWhoSayNixmltodict
от Мартина Блехаruamel.yaml
от Антона ван дер Нойтаtrparse
от Луиса Бенитеса Вот несколько примеров вывода jc
. Дополнительные примеры см. здесь или в документации по парсеру.
arp | jc -p --arp # or: jc -p arp
[
{
"address" : " gateway " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:f7:4a:fc " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.1 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:c0:00:08 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
},
{
"address" : " 192.168.71.254 " ,
"hwtype" : " ether " ,
"hwaddress" : " 00:50:56:fe:7a:b4 " ,
"flags_mask" : " C " ,
"iface" : " ens33 "
}
]
cat homes.csv
"Sell", "List", "Living", "Rooms", "Beds", "Baths", "Age", "Acres", "Taxes"
142, 160, 28, 10, 5, 3, 60, 0.28, 3167
175, 180, 18, 8, 4, 1, 12, 0.43, 4033
129, 132, 13, 6, 3, 1, 41, 0.33, 1471
...
cat homes.csv | jc -p --csv
[
{
"Sell" : " 142 " ,
"List" : " 160 " ,
"Living" : " 28 " ,
"Rooms" : " 10 " ,
"Beds" : " 5 " ,
"Baths" : " 3 " ,
"Age" : " 60 " ,
"Acres" : " 0.28 " ,
"Taxes" : " 3167 "
},
{
"Sell" : " 175 " ,
"List" : " 180 " ,
"Living" : " 18 " ,
"Rooms" : " 8 " ,
"Beds" : " 4 " ,
"Baths" : " 1 " ,
"Age" : " 12 " ,
"Acres" : " 0.43 " ,
"Taxes" : " 4033 "
},
{
"Sell" : " 129 " ,
"List" : " 132 " ,
"Living" : " 13 " ,
"Rooms" : " 6 " ,
"Beds" : " 3 " ,
"Baths" : " 1 " ,
"Age" : " 41 " ,
"Acres" : " 0.33 " ,
"Taxes" : " 1471 "
}
]
cat /etc/hosts | jc -p --hosts
[
{
"ip" : " 127.0.0.1 " ,
"hostname" : [
" localhost "
]
},
{
"ip" : " ::1 " ,
"hostname" : [
" ip6-localhost " ,
" ip6-loopback "
]
},
{
"ip" : " fe00::0 " ,
"hostname" : [
" ip6-localnet "
]
}
]
ifconfig | jc -p --ifconfig # or: jc -p ifconfig
[
{
"name" : " ens33 " ,
"flags" : 4163 ,
"state" : [
" UP " ,
" BROADCAST " ,
" RUNNING " ,
" MULTICAST "
],
"mtu" : 1500 ,
"ipv4_addr" : " 192.168.71.137 " ,
"ipv4_mask" : " 255.255.255.0 " ,
"ipv4_bcast" : " 192.168.71.255 " ,
"ipv6_addr" : " fe80::c1cb:715d:bc3e:b8a0 " ,
"ipv6_mask" : 64 ,
"ipv6_scope" : " 0x20 " ,
"mac_addr" : " 00:0c:29:3b:58:0e " ,
"type" : " Ethernet " ,
"rx_packets" : 8061 ,
"rx_bytes" : 1514413 ,
"rx_errors" : 0 ,
"rx_dropped" : 0 ,
"rx_overruns" : 0 ,
"rx_frame" : 0 ,
"tx_packets" : 4502 ,
"tx_bytes" : 866622 ,
"tx_errors" : 0 ,
"tx_dropped" : 0 ,
"tx_overruns" : 0 ,
"tx_carrier" : 0 ,
"tx_collisions" : 0 ,
"metric" : null
}
]
cat example.ini
foo = fiz
bar = buz
[section1]
fruit = apple
color = blue
[section2]
fruit = pear
color = green
cat example.ini | jc -p --ini
{
"foo" : " fiz " ,
"bar" : " buz " ,
"section1" : {
"fruit" : " apple " ,
"color" : " blue "
},
"section2" : {
"fruit" : " pear " ,
"color" : " green "
}
}
$ ls -l /usr/bin | jc -p --ls # or: jc -p ls -l /usr/bin
[
{
"filename" : " apropos " ,
"link_to" : " whatis " ,
"flags" : " lrwxrwxrwx. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 6 ,
"date" : " Aug 15 10:53 "
},
{
"filename" : " ar " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 62744 ,
"date" : " Aug 8 16:14 "
},
{
"filename" : " arch " ,
"flags" : " -rwxr-xr-x. " ,
"links" : 1 ,
"owner" : " root " ,
"group" : " root " ,
"size" : 33080 ,
"date" : " Aug 19 23:25 "
}
]
netstat -apee | jc -p --netstat # or: jc -p netstat -apee
[
{
"proto" : " tcp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : " LISTEN " ,
"user" : " systemd-resolve " ,
"inode" : 26958 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " tcp6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " LISTEN " ,
"user" : " root " ,
"inode" : 30510 ,
"program_name" : " sshd " ,
"kind" : " network " ,
"pid" : 1186 ,
"local_port" : " ssh " ,
"foreign_port" : " * " ,
"transport_protocol" : " tcp " ,
"network_protocol" : " ipv6 "
},
{
"proto" : " udp " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " localhost " ,
"foreign_address" : " 0.0.0.0 " ,
"state" : null ,
"user" : " systemd-resolve " ,
"inode" : 26957 ,
"program_name" : " systemd-resolve " ,
"kind" : " network " ,
"pid" : 887 ,
"local_port" : " domain " ,
"foreign_port" : " * " ,
"transport_protocol" : " udp " ,
"network_protocol" : " ipv4 "
},
{
"proto" : " raw6 " ,
"recv_q" : 0 ,
"send_q" : 0 ,
"local_address" : " [::] " ,
"foreign_address" : " [::] " ,
"state" : " 7 " ,
"user" : " systemd-network " ,
"inode" : 27001 ,
"program_name" : " systemd-network " ,
"kind" : " network " ,
"pid" : 867 ,
"local_port" : " ipv6-icmp " ,
"foreign_port" : " * " ,
"transport_protocol" : null ,
"network_protocol" : " ipv6 "
},
{
"proto" : " unix " ,
"refcnt" : 2 ,
"flags" : null ,
"type" : " DGRAM " ,
"state" : null ,
"inode" : 33322 ,
"program_name" : " systemd " ,
"path" : " /run/user/1000/systemd/notify " ,
"kind" : " socket " ,
"pid" : 1607
}
]
cat /etc/passwd | jc -p --passwd
[
{
"username" : " root " ,
"password" : " * " ,
"uid" : 0 ,
"gid" : 0 ,
"comment" : " System Administrator " ,
"home" : " /var/root " ,
"shell" : " /bin/sh "
},
{
"username" : " daemon " ,
"password" : " * " ,
"uid" : 1 ,
"gid" : 1 ,
"comment" : " System Services " ,
"home" : " /var/root " ,
"shell" : " /usr/bin/false "
}
]
ping 8.8.8.8 -c 3 | jc -p --ping # or: jc -p ping 8.8.8.8 -c 3
{
"destination_ip" : " 8.8.8.8 " ,
"data_bytes" : 56 ,
"pattern" : null ,
"destination" : " 8.8.8.8 " ,
"packets_transmitted" : 3 ,
"packets_received" : 3 ,
"packet_loss_percent" : 0.0 ,
"duplicates" : 0 ,
"time_ms" : 2005.0 ,
"round_trip_ms_min" : 23.835 ,
"round_trip_ms_avg" : 30.46 ,
"round_trip_ms_max" : 34.838 ,
"round_trip_ms_stddev" : 4.766 ,
"responses" : [
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 1 ,
"ttl" : 118 ,
"time_ms" : 23.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 2 ,
"ttl" : 118 ,
"time_ms" : 34.8 ,
"duplicate" : false
},
{
"type" : " reply " ,
"timestamp" : null ,
"bytes" : 64 ,
"response_ip" : " 8.8.8.8 " ,
"icmp_seq" : 3 ,
"ttl" : 118 ,
"time_ms" : 32.7 ,
"duplicate" : false
}
]
}
ps axu | jc -p --ps # or: jc -p ps axu
[
{
"user" : " root " ,
"pid" : 1 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.1 ,
"vsz" : 128072 ,
"rss" : 6784 ,
"tty" : null ,
"stat" : " Ss " ,
"start" : " Nov09 " ,
"time" : " 0:08 " ,
"command" : " /usr/lib/systemd/systemd --switched-root --system --deseria... "
},
{
"user" : " root " ,
"pid" : 2 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kthreadd] "
},
{
"user" : " root " ,
"pid" : 4 ,
"cpu_percent" : 0.0 ,
"mem_percent" : 0.0 ,
"vsz" : 0 ,
"rss" : 0 ,
"tty" : null ,
"stat" : " S< " ,
"start" : " Nov09 " ,
"time" : " 0:00 " ,
"command" : " [kworker/0:0H] "
}
]
traceroute -m 2 8.8.8.8 | jc -p --traceroute
# or: jc -p traceroute -m 2 8.8.8.8
{
"destination_ip" : " 8.8.8.8 " ,
"destination_name" : " 8.8.8.8 " ,
"hops" : [
{
"hop" : 1 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.616
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.413
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 192.168.1.254 " ,
"name" : " dsldevice.local.net " ,
"rtt" : 6.308
}
]
},
{
"hop" : 2 ,
"probes" : [
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.367
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 40.197
},
{
"annotation" : null ,
"asn" : null ,
"ip" : " 76.220.24.1 " ,
"name" : " 76-220-24-1.lightspeed.sntcca.sbcglobal.net " ,
"rtt" : 29.162
}
]
}
]
}
uptime | jc -p --uptime # or: jc -p uptime
{
"time" : " 11:35 " ,
"uptime" : " 3 days, 4:03 " ,
"users" : 5 ,
"load_1m" : 1.88 ,
"load_5m" : 2.0 ,
"load_15m" : 1.94 ,
"time_hour" : 11 ,
"time_minute" : 35 ,
"time_second" : null ,
"uptime_days" : 3 ,
"uptime_hours" : 4 ,
"uptime_minutes" : 3 ,
"uptime_total_seconds" : 273780
}
cat cd_catalog.xml
xml version = " 1.0 " encoding = " UTF-8 " ?> < CATALOG > < CD > < TITLE >Empire Burlesque TITLE > < ARTIST >Bob Dylan ARTIST > < COUNTRY >USA COUNTRY > < COMPANY >Columbia COMPANY > < PRICE >10.90 PRICE > < YEAR >1985 YEAR > CD > < CD > < TITLE >Hide your heart TITLE > < ARTIST >Bonnie Tyler ARTIST > < COUNTRY >UK COUNTRY > < COMPANY >CBS Records COMPANY > < PRICE >9.90 PRICE > < YEAR >1988 YEAR > CD > ...
cat cd_catalog.xml | jc -p --xml
{
"CATALOG" : {
"CD" : [
{
"TITLE" : " Empire Burlesque " ,
"ARTIST" : " Bob Dylan " ,
"COUNTRY" : " USA " ,
"COMPANY" : " Columbia " ,
"PRICE" : " 10.90 " ,
"YEAR" : " 1985 "
},
{
"TITLE" : " Hide your heart " ,
"ARTIST" : " Bonnie Tyler " ,
"COUNTRY" : " UK " ,
"COMPANY" : " CBS Records " ,
"PRICE" : " 9.90 " ,
"YEAR" : " 1988 "
}
]
}
}
cat istio.yaml
apiVersion : " authentication.istio.io/v1alpha1 "
kind : " Policy "
metadata :
name : " default "
namespace : " default "
spec :
peers :
- mtls : {}
---
apiVersion : " networking.istio.io/v1alpha3 "
kind : " DestinationRule "
metadata :
name : " default "
namespace : " default "
spec :
host : " *.default.svc.cluster.local "
trafficPolicy :
tls :
mode : ISTIO_MUTUAL
cat istio.yaml | jc -p --yaml
[
{
"apiVersion" : " authentication.istio.io/v1alpha1 " ,
"kind" : " Policy " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"peers" : [
{
"mtls" : {}
}
]
}
},
{
"apiVersion" : " networking.istio.io/v1alpha3 " ,
"kind" : " DestinationRule " ,
"metadata" : {
"name" : " default " ,
"namespace" : " default "
},
"spec" : {
"host" : " *.default.svc.cluster.local " ,
"trafficPolicy" : {
"tls" : {
"mode" : " ISTIO_MUTUAL "
}
}
}
}
]
© 2019-2024 Келли Бразилия