Consulte la documentación del paquete
jc
Python para desarrolladores
Pruebe la demostración web
jc
y la API REST
jc
está disponible como complemento de filtro de Ansible en la coleccióncommunity.general
. Vea esta publicación de blog para ver un ejemplo.
Convertir JSON
jc
JSONifica la salida de muchas herramientas CLI, tipos de archivos y cadenas comunes para facilitar el análisis de los scripts. Consulte la sección Analizadores para conocer los comandos, tipos de archivos y cadenas admitidos.
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 }]
Esto permite un mayor procesamiento de la salida en la línea de comandos con herramientas como jq
o jello
mediante comandos de canalización:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
o usando la sintaxis "mágica" alternativa:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
también se puede utilizar como biblioteca de Python. En este caso, el valor devuelto será un diccionario de Python, una lista de diccionarios o incluso un iterable diferido de diccionarios en lugar de 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' }]
Para obtener la documentación del paquete
jc
Python, utilicehelp('jc')
,help('jc.lib')
o consulte la documentación en línea.
Hay dos representaciones de los datos disponibles. La representación predeterminada utiliza un esquema estricto por analizador y convierte números conocidos en valores JSON int/float. Ciertos valores conocidos de None
se convierten a JSON null
, los valores booleanos conocidos se convierten y, en algunos casos, se agregan campos de contexto semántico adicionales.
Para acceder al JSON sin procesar y preprocesado, use la opción -r
cli o el parámetro de función raw=True
en parse()
cuando use jc
como biblioteca de Python.
Los esquemas para cada analizador se pueden encontrar en el enlace de documentación al lado de cada analizador a continuación.
Las notas de la versión se pueden encontrar en la sección Lanzamientos en Github.
Para obtener más información sobre las motivaciones de este proyecto, consulte la publicación de mi blog sobre Llevar la filosofía Unix al siglo XXI y mi entrevista con Console.
Ver también:
Casos de uso:
Hay varias formas de obtener jc
. Puede realizar la instalación mediante pip
, repositorios de paquetes del sistema operativo o descargando el binario correcto para su arquitectura y ejecutándolo en cualquier lugar de su sistema de archivos.
pip3 install jc
SO | Dominio |
---|---|
Debian/UbuntuLinux | apt-get install jc |
fedora linux | dnf install jc |
openSUSElinux | zypper install jc |
arco linux | pacman -S jc |
nixos linux | nix-env -iA nixpkgs.jc o nix-env -iA nixos.jc |
sistema guix linux | guix install jc |
Gentoo Linux | emerge dev-python/jc |
fotón linux | tdnf install jc |
macos | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Complemento de filtro ansible | ansible-galaxy collection install community.general |
Conector FortiSOAR | Instalar desde el mercado de conectores FortiSOAR |
Para obtener más paquetes de sistema operativo, consulte https://repology.org/project/jc/versions.
Para archivos binarios precompilados, consulte Lanzamientos en Github.
jc
acepta entradas canalizadas desde STDIN
y genera una representación JSON de la salida del comando anterior a STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternativamente, se puede usar la sintaxis "mágica" anteponiendo jc
al comando que se va a convertir o delante de la ruta absoluta para los archivos Proc. Las opciones se pueden pasar a jc
inmediatamente antes de que se proporcione el comando o la ruta del archivo Proc. (Nota: los alias de comandos y las funciones integradas del shell no son compatibles)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
La salida JSON puede ser compacta (predeterminada) o con un formato bonito con la opción -p
.
Argumento | Comando o tipo de archivo | Documentación |
---|---|---|
--acpi | analizador de comandos acpi | detalles |
--airport | airport -I comando analizador | detalles |
--airport-s | analizador de comandos airport -s | detalles |
--apt-cache-show | analizador de comandos apt-cache show | detalles |
--apt-get-sqq | analizador de comandos apt-get -sqq | detalles |
--arp | analizador de comandos arp | detalles |
--asciitable | Analizador de tablas ASCII y Unicode | detalles |
--asciitable-m | analizador de tablas ASCII y Unicode multilínea | detalles |
--blkid | analizador de comandos blkid | detalles |
--bluetoothctl | analizador de comandos bluetoothctl | detalles |
--cbt | analizador de comandos cbt (Google Bigtable) | detalles |
--cef | Analizador de cadenas CEF | detalles |
--cef-s | Analizador de transmisión de cadenas CEF | detalles |
--certbot | analizador de comandos certbot | detalles |
--chage | analizador de comandos chage --list | detalles |
--cksum | analizador de comandos cksum y sum | detalles |
--clf | Analizador de archivos de formato de registro común y combinado | detalles |
--clf-s | Analizador de transmisión de archivos de formato de registro común y combinado | detalles |
--crontab | Comando crontab y analizador de archivos. | detalles |
--crontab-u | analizador de archivos crontab con soporte para el usuario | detalles |
--csv | analizador de archivos CSV | detalles |
--csv-s | Analizador de transmisión de archivos CSV | detalles |
--curl-head | analizador de comandos curl --head | detalles |
--date | analizador de comandos date | detalles |
--datetime-iso | Analizador de cadenas de fecha y hora ISO 8601 | detalles |
--debconf-show | analizador de comandos debconf-show | detalles |
--df | analizador de comandos df | detalles |
--dig | analizador de comandos dig | detalles |
--dir | analizador de comandos dir | detalles |
--dmidecode | analizador de comandos dmidecode | detalles |
--dpkg-l | analizador de comandos dpkg -l | detalles |
--du | analizador du comandos | detalles |
--efibootmgr | analizador de comandos efibootmgr | detalles |
--email-address | Analizador de cadenas de direcciones de correo electrónico | detalles |
--env | analizador de comandos env | detalles |
--ethtool | analizador de comandos ethtool | detalles |
--file | analizador de comandos file | detalles |
--find | find analizador de comandos | detalles |
--findmnt | analizador de comandos findmnt | detalles |
--finger | analizador de comandos finger | detalles |
--free | analizador de comandos free | detalles |
--fstab | /etc/fstab analizador de archivos | detalles |
--git-log | analizador de comandos git log | detalles |
--git-log-s | analizador de transmisión de comandos git log | detalles |
--git-ls-remote | analizador de comandos git ls-remote | detalles |
--gpg | gpg --with-colons analizador de comandos | detalles |
--group | /etc/group | detalles |
--gshadow | /etc/gshadow analizador de archivos | detalles |
--hash | analizador de comandos hash | detalles |
--hashsum | Analizador de comandos hashsum ( md5sum , shasum , etc.) | detalles |
--hciconfig | analizador de comandos hciconfig | detalles |
--history | analizador de comandos history | detalles |
--host | analizador de comandos host | detalles |
--hosts | /etc/hosts analizador de archivos | detalles |
--http-headers | analizador de encabezados HTTP | detalles |
--id | id de comandos de identificación | detalles |
--ifconfig | analizador de comandos ifconfig | detalles |
--ini | analizador de archivos INI | detalles |
--ini-dup | INI con analizador de archivos de claves duplicadas | detalles |
--iostat | analizador de comandos iostat | detalles |
--iostat-s | analizador de transmisión de comandos iostat | detalles |
--ip-address | Analizador de cadenas de direcciones IPv4 e IPv6 | detalles |
--ipconfig | Analizador de comandos de Windows ipconfig | detalles |
--iptables | analizador de comandos iptables | detalles |
--ip-route | analizador de comandos ip route | detalles |
--iw-scan | Analizador de comandos iw dev [device] scan | detalles |
--iwconfig | analizador de comandos iwconfig | detalles |
--jar-manifest | Analizador de archivos Java MANIFEST.MF | detalles |
--jobs | analizador de comandos jobs | detalles |
--jwt | analizador de cadenas JWT | detalles |
--kv | Archivo de clave/valor y analizador de cadenas | detalles |
--kv-dup | Clave/Valor con archivo de clave duplicado y analizador de cadenas | detalles |
--last | analizador de comandos last y lastb | detalles |
--ls | ls analizador de comandos | detalles |
--ls-s | analizador de transmisión de comandos ls | detalles |
--lsattr | analizador de comandos lsattr | detalles |
--lsb-release | analizador de comandos lsb_release | detalles |
--lsblk | analizador de comandos lsblk | detalles |
--lsmod | analizador de comandos lsmod | detalles |
--lsof | analizador de comandos lsof | detalles |
--lspci | analizador de comandos lspci -mmv | detalles |
--lsusb | analizador de comandos lsusb | detalles |
--m3u | Analizador de archivos M3U y M3U8 | detalles |
--mdadm | analizador de comandos mdadm | detalles |
--mount | mount analizador de comandos | detalles |
--mpstat | analizador de comandos mpstat | detalles |
--mpstat-s | analizador de transmisión de comandos mpstat | detalles |
--needrestart | needrestart -b analizador de comandos | detalles |
--netstat | analizador de comandos netstat | detalles |
--nmcli | analizador de comandos nmcli | detalles |
--nsd-control | analizador de comandos nsd-control | detalles |
--ntpq | analizador de comandos ntpq -p | detalles |
--openvpn | analizador de archivos openvpn-status.log | detalles |
--os-prober | analizador de comandos os-prober | detalles |
--os-release | /etc/os-release analizador de archivos | detalles |
--pacman | analizador de comandos pacman | detalles |
--passwd | /etc/passwd analizador de archivos | detalles |
--path | Analizador de cadenas de ruta POSIX | detalles |
--path-list | Analizador de cadenas de lista de rutas POSIX | detalles |
--pci-ids | analizador de archivos pci.ids | detalles |
--pgpass | Analizador de archivos de contraseñas de PostgreSQL | detalles |
--pidstat | analizador de comandos pidstat -H | detalles |
--pidstat-s | analizador de transmisión de comandos pidstat -H | detalles |
--ping | analizador de comandos ping y ping6 | detalles |
--ping-s | Analizador de transmisión de comandos ping y ping6 | detalles |
--pip-list | analizador de comandos pip list | detalles |
--pip-show | analizador de comandos pip show | detalles |
--pkg-index-apk | Analizador de archivos de índice de paquetes de Alpine Linux | detalles |
--pkg-index-deb | Analizador de archivos de índice de paquetes de Debian | detalles |
--plist | analizador de archivos PLIST | detalles |
--postconf | postconf -M analizador de comandos | detalles |
--proc | /proc/ analizador de archivos | detalles |
--ps | analizador de comandos ps | detalles |
--resolve-conf | /etc/resolve.conf analizador de archivos | detalles |
--route | analizador de comandos route | detalles |
--rpm-qi | analizador de comandos rpm -qi | detalles |
--rsync | analizador de comandos rsync | detalles |
--rsync-s | analizador de transmisión de comandos rsync | detalles |
--semver | Analizador de cadenas de versión semántica | detalles |
--sfdisk | analizador de comandos sfdisk | detalles |
--shadow | /etc/shadow | detalles |
--srt | analizador de archivos SRT | detalles |
--ss | analizador de comandos ss | detalles |
--ssh-conf | Archivo de configuración ssh y analizador de comandos ssh -G | detalles |
--sshd-conf | Archivo de configuración sshd y analizador de comandos sshd -T | detalles |
--stat | analizador de comandos de stat | detalles |
--stat-s | analizador de transmisión de comandos stat | detalles |
--swapon | analizador de comandos swapon | detalles |
--sysctl | analizador de comandos sysctl | detalles |
--syslog | Analizador de cadenas Syslog RFC 5424 | detalles |
--syslog-s | Analizador de transmisión de cadenas Syslog RFC 5424 | detalles |
--syslog-bsd | Analizador de cadenas Syslog RFC 3164 | detalles |
--syslog-bsd-s | Analizador de transmisión de cadenas Syslog RFC 3164 | detalles |
--systemctl | analizador de comandos systemctl | detalles |
--systemctl-lj | analizador de comandos systemctl list-jobs | detalles |
--systemctl-ls | analizador de comandos systemctl list-sockets | detalles |
--systemctl-luf | analizador de comandos systemctl list-unit-files | detalles |
--systeminfo | analizador de comandos systeminfo | detalles |
--time | /usr/bin/time analizador de comandos | detalles |
--timedatectl | analizador de comandos timedatectl status | detalles |
--timestamp | Analizador de cadenas de marca de tiempo Unix Epoch | detalles |
--toml | analizador de archivos TOML | detalles |
--top | analizador de comandos top -b | detalles |
--top-s | analizador de transmisión de comandos top -b | detalles |
--tracepath | analizador de comandos tracepath y tracepath6 | detalles |
--traceroute | Analizador de comandos traceroute y traceroute6 | detalles |
--tune2fs | tune2fs -l analizador de comandos | detalles |
--udevadm | analizador de comandos udevadm info | detalles |
--ufw | analizador de comandos ufw status | detalles |
--ufw-appinfo | Analizador de comandos de ufw app info [application] | detalles |
--uname | uname -a analizador de comandos | detalles |
--update-alt-gs | analizador de comandos update-alternatives --get-selections | detalles |
--update-alt-q | update-alternatives --query | detalles |
--upower | analizador de comandos upower | detalles |
--uptime | analizador de comandos uptime | detalles |
--url | analizador de cadenas de URL | detalles |
--ver | Analizador de cadenas de versión | detalles |
--veracrypt | analizador de comandos veracrypt | detalles |
--vmstat | analizador de comandos vmstat | detalles |
--vmstat-s | analizador de transmisión de comandos vmstat | detalles |
--w | w analizador de comandos | detalles |
--wc | analizador de comandos wc | detalles |
--wg-show | analizador de comandos wg show | detalles |
--who | who ordena el analizador | detalles |
--x509-cert | Analizador de archivos de certificados X.509 PEM y DER | detalles |
--x509-csr | Analizador de archivos de solicitud de certificados X.509 PEM y DER | detalles |
--xml | analizador de archivos XML | detalles |
--xrandr | analizador de comandos xrandr | detalles |
--yaml | analizador de archivos YAML | detalles |
--zipinfo | analizador de comandos zipinfo | detalles |
--zpool-iostat | analizador de comandos zpool iostat | detalles |
--zpool-status | analizador de comandos zpool status | detalles |
Corto | Largo | Descripción |
---|---|---|
-a | --about | Acerca de jc . Imprime información sobre jc y los analizadores (¡en JSON o YAML, por supuesto!) |
-C | --force-color | Forzar la salida de color incluso cuando se utilizan tuberías (anula -m y la variable de entorno NO_COLOR ) |
-d | --debug | Modo de depuración. Imprime mensajes de seguimiento si se encuentran problemas de análisis (use -dd para una depuración detallada) |
-h | --help | Ayuda. Utilice jc -h --parser_name para la documentación del analizador. Úselo dos veces para mostrar analizadores ocultos (por ejemplo, -hh ). Úselo tres veces para mostrar las categorías del analizador (por ejemplo, -hhh ). |
-m | --monochrome | Salida monocromática |
-M | --meta-out | Agregue metadatos a la salida, incluida la marca de tiempo, el nombre del analizador, el comando mágico, el código de salida del comando mágico, etc. |
-p | --pretty | Formatee bastante la salida JSON |
-q | --quiet | Modo silencioso. Suprime los mensajes de advertencia del analizador (use -qq para ignorar los errores del analizador de transmisión) |
-r | --raw | Salida bruta. Proporciona una salida más literal, normalmente con valores de cadena y sin procesamiento semántico adicional. |
-s | --slurp | Incorpora varias líneas en una matriz. (use -hhh para encontrar analizadores compatibles) |
-u | --unbuffer | Salida sin búfer |
-v | --version | Información de versión |
-y | --yaml-out | salida YAML |
-B | --bash-comp | Generar script de finalización de shell Bash (más información) |
-Z | --zsh-comp | Generar script de finalización de shell Zsh (más información) |
El corte de líneas se admite mediante la sintaxis START:STOP
similar al corte de Python. Esto le permite omitir líneas al principio y/o al final de la entrada STDIN
que desea que jc
convierta.
START
y STOP
pueden ser enteros positivos o negativos o estar en blanco y le permiten especificar cuántas líneas omitir y cuántas líneas procesar. Los sectores positivos y en blanco son los que ahorran más memoria. Cualquier número entero negativo en el segmento utilizará más memoria.
Por ejemplo, para omitir la primera y la última línea del siguiente texto, puede expresar el segmento de dos maneras:
$ 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 " }]
En este ejemplo, los cortes de línea 1:-1
y 1:4
proporcionan el mismo resultado.
Cuando se utilizan números enteros positivos, la ubicación del índice de STOP
no es inclusiva. Los cortes positivos cuentan desde la primera línea de la entrada hacia el final, comenzando en 0
como primera línea. Los cortes negativos cuentan desde la última línea hacia el principio comenzando en -1
como última línea. Esta es también la forma en que funciona la función de corte de Python.
Aquí hay un desglose de las opciones de corte de línea:
Notación de corte | Líneas de entrada procesadas |
---|---|
START:STOP | líneas START a STOP - 1 |
START: | líneas START a través del resto de la salida |
:STOP | líneas desde el principio hasta STOP - 1 |
-START:STOP | Líneas START desde el final hasta STOP - 1 |
START:-STOP | líneas START a líneas STOP desde el final |
-START:-STOP | Líneas START desde el final hasta líneas STOP desde el final |
-START: | Líneas de START desde el final hasta el resto de la salida. |
:-STOP | líneas desde el principio hasta líneas STOP desde el final |
: | todas las lineas |
Algunos analizadores admiten la entrada de varios elementos y pueden generar una serie de resultados en una sola pasada. Slurping funciona para analizadores de cadenas que aceptan una sola línea de entrada. (por ejemplo, url
y ip-address
) Para ver una lista de analizadores que admiten la opción --slurp
, utilice jc -hhh
.
Por ejemplo, puede enviar un archivo con varias direcciones IP (una por línea) a jc
con la opción --slurp
y se generará una serie de resultados:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
La sintaxis mágica para archivos /proc
admite automáticamente la extracción de múltiples archivos (no es necesario usar la opción --slurp
). Por ejemplo, puedes convertir muchos archivos PID a la vez:
$ jc /proc/ * /status
[ < multiple output objects > ]
Cuando se utiliza la sintaxis mágica /proc
y se seleccionan varios archivos, se inserta un campo _file
adicional en la salida para que sea más fácil saber a qué archivo se refiere cada objeto de salida.
Finalmente, la opción --meta-out
se puede utilizar junto con la salida sorbida. En este caso, la salida sorbida está envuelta en un objeto con la siguiente estructura:
{
"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 "
]
}
}
Con --meta-out
, input_list
contiene una lista de entradas (cadenas de entrada reales o nombres de archivo /proc
) para que pueda identificar qué objeto de salida se relaciona con cada cadena de entrada o nombre de archivo /proc
.
Cualquier error fatal dentro de jc
generará un código de salida de 100
; de lo contrario, el código de salida será 0
.
Cuando se utiliza la sintaxis "mágica" (por ejemplo, jc ifconfig eth0
), jc
almacenará el código de salida del programa que se está analizando y lo agregará al código de salida jc
. De esta manera es más fácil determinar si un error provino del programa analizado o jc
.
Considere los siguientes ejemplos usando ifconfig
:
código de salida ifconfig | código de salida jc | Código de salida combinado | Interpretación |
---|---|---|---|
0 | 0 | 0 | Sin errores |
1 | 0 | 1 | Error en ifconfig |
0 | 100 | 100 | error en jc |
1 | 100 | 101 | Error tanto en ifconfig como en jc |
Al utilizar la sintaxis "mágica", también puede recuperar el código de salida del programa llamado utilizando la opción --meta-out
o -M
. Esto agregará un objeto _jc_meta
a la salida que incluirá la información del comando mágico, incluido el código de salida.
Aquí hay un ejemplo con 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
Puede especificar colores personalizados a través de la variable de entorno JC_COLORS
. La variable de entorno JC_COLORS
toma cuatro valores de cadena separados por comas en el siguiente formato:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Donde los colores son: black
, red
, green
, yellow
, blue
, magenta
, cyan
, gray
, brightblack
brightred
, brightgreen
, brightyellow
, brightblue
, brightmagenta
, brightcyan
, white
o default
Por ejemplo, para configurar los colores predeterminados:
JC_COLORS=blue,brightblack,magenta,green
o
JC_COLORS=default,default,default,default
Puede configurar la variable de entorno NO_COLOR
en cualquier valor para deshabilitar la salida de color en jc
. Tenga en cuenta que el uso de la opción -C
para forzar la salida de color anulará tanto la variable de entorno NO_COLOR
como la opción -m
.
La mayoría de los analizadores cargan todos los datos de STDIN
, los analizan y luego generan el documento JSON completo en serie. Hay algunos analizadores de transmisión (por ejemplo, ls-s
y ping-s
) que inmediatamente comienzan a procesar y generar los datos línea por línea como líneas JSON (también conocidas como NDJSON) mientras se reciben de STDIN
. Esto puede reducir significativamente la cantidad de memoria necesaria para analizar grandes cantidades de resultados de comandos (por ejemplo, ls -lR /
) y, en ocasiones, puede procesar los datos más rápidamente. Los analizadores de streaming tienen un comportamiento ligeramente diferente al de los analizadores estándar, como se describe a continuación.
Nota: Los analizadores de streaming no se pueden utilizar con la sintaxis "mágica"
Es posible que desee ignorar los errores de análisis cuando utilice analizadores de transmisión, ya que pueden usarse en canalizaciones de procesamiento de larga duración y los errores pueden romper la canalización. Para ignorar los errores de análisis, utilice la opción -qq
cli o el argumento ignore_exceptions=True
con la función parse()
. Esto agregará un objeto _jc_meta
a la salida JSON con un atributo success
. Si success
es true
, entonces no hubo problemas al analizar la línea. Si success
es false
, entonces se encontró un problema de análisis y se agregarán campos line
y error
para incluir una breve descripción del error y el contenido de la línea no analizable, respectivamente:
Línea analizada correctamente con la opción -qq
:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Línea analizada sin éxito con la opción -qq
:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
La mayoría de los sistemas operativos almacenarán en búfer la salida que se canaliza de un proceso a otro. El búfer suele ser de unos 4 KB. Al visualizar la salida en el terminal, el búfer del sistema operativo no está activado, por lo que la salida se muestra inmediatamente en la pantalla. Sin embargo, al conectar varios procesos, puede parecer que la salida se bloquea cuando los datos de entrada son muy lentos (por ejemplo, ping
):
$ ping 1.1.1.1 | jc --ping-s | jq
Esto se debe a que el sistema operativo utiliza el búfer de 4 KB entre jc
y jq
en este ejemplo. Para mostrar los datos en el terminal en tiempo real, puede desactivar el búfer con la opción -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...}
...
Nota: La salida sin búfer puede ser más lenta para grandes flujos de datos.
Los analizadores de streaming aceptan cualquier objeto iterable y devuelven un objeto iterable que permite el procesamiento diferido de los datos. Los datos de entrada deben iterarse en líneas de datos de cadena. Ejemplos de buenos datos de entrada son sys.stdin
o str.splitlines()
.
Para usar el objeto iterable devuelto en su código, simplemente recorralo o use la función incorporada next():
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Los complementos del analizador se pueden colocar en una carpeta jc/jcparsers
en su "directorio de datos de aplicaciones" local:
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Los complementos del analizador son archivos de módulo estándar de Python. Utilice el analizador jc/parsers/foo.py
o jc/parsers/foo_s.py (streaming)
como plantilla y simplemente coloque un archivo .py
en la subcarpeta jcparsers
. Cualquier dependencia se puede colocar en la carpeta jc
encima de jcparsers
y se puede importar en el código del analizador.
Los nombres de archivos del complemento del analizador deben ser nombres de módulos de Python válidos y, por lo tanto, deben comenzar con una letra y consistir enteramente en caracteres alfanuméricos y guiones bajos. Los complementos locales pueden anular los analizadores predeterminados.
Nota: El directorio de datos de la aplicación sigue la especificación del directorio base XDG.
Para obtener mejores resultados, establezca las variables de entorno local en C
o en_US.UTF-8
modificando la variable LC_ALL
:
$ LC_ALL=C date | jc --date
También puede configurar las variables locales individualmente:
$ export LANG=C
$ export LC_NUMERIC=C
En algunos sistemas más antiguos, la salida UTF-8 se degradará a ASCII con secuencias de escape \u
si la configuración regional C
no admite la codificación UTF-8.
Algunos analizadores han calculado campos de marca de tiempo de época agregados a la salida. A menos que el nombre de un campo de marca de tiempo tenga el sufijo _utc
, se considera ingenuo. (es decir, según la zona horaria local del sistema en el que se ejecutó el analizador jc
).
Si se puede detectar una zona horaria UTC en el texto de la salida del comando, la marca de tiempo tendrá en cuenta la zona horaria y tendrá un sufijo _utc
en el nombre de la clave. (por ejemplo, epoch_utc
) No se admiten otras zonas horarias para marcas de tiempo conscientes.
jc
se puede utilizar en casi cualquier shell. Algunos shells modernos tienen capacidades de filtrado y deserialización JSON incorporadas, lo que hace que el uso de jc
sea aún más conveniente.
Por ejemplo, lo siguiente es posible en NGS (Next Generation Shell):
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
Esto ejecuta jc
, analiza el JSON de salida y asigna la estructura de datos resultante a una variable en una sola línea de código.
Para obtener más ejemplos de cómo usar jc
en otros shells, consulte esta página wiki.
Algunos analizadores como dig
, xml
, csv
, etc. funcionarán en cualquier plataforma. Otros analizadores que convierten resultados específicos de una plataforma generarán un mensaje de advertencia si se ejecutan en una plataforma no compatible. Para ver toda la información del analizador, incluida la compatibilidad, ejecute jc -ap
.
Es posible que aún utilice un analizador en una plataforma no compatible; por ejemplo, es posible que desee analizar un archivo con salida lsof
de Linux en una computadora portátil macOS o Windows. En ese caso, puede suprimir el mensaje de advertencia con la opción -q
cli o el parámetro de función quiet=True
en parse()
:
MacOS:
cat lsof.out | jc -q --lsof
o Windows:
type lsof.out | jc -q --lsof
Probado en:
¡Siéntete libre de agregar/mejorar código o analizadores! Puede utilizar los analizadores jc/parsers/foo.py
o jc/parsers/foo_s.py (streaming)
como plantilla y enviar su analizador con una solicitud de extracción.
Consulte las Pautas de contribución para obtener más información.
ifconfig-parser
de KnightWhoSayNixmltodict
de Martín Blechruamel.yaml
de Anthon van der Neuttrparse
de Luis Benítez A continuación se muestran algunos ejemplos de salida jc
. Para obtener más ejemplos, consulte aquí o la documentación del analizador.
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 Kelly Brasil