Confira a documentação do pacote
jc
Python para desenvolvedores
Experimente a demonstração da web
jc
e a API REST
jc
está disponível como um plugin de filtro Ansible na coleçãocommunity.general
. Veja esta postagem do blog para ver um exemplo.
Conversão JSON
jc
JSONifica a saída de muitas ferramentas CLI, tipos de arquivos e strings comuns para facilitar a análise em scripts. Consulte a seção Analisadores para comandos, tipos de arquivo e strings suportados.
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 }]
Isso permite processamento adicional de saída na linha de comando com ferramentas como jq
ou jello
por meio de comandos de canal:
$ dig example.com | jc --dig | jq -r ' .[].answer[].data '
93.184.216.34
ou usando a sintaxe "mágica" alternativa:
$ jc dig example.com | jq -r ' .[].answer[].data '
93.184.216.34
jc
também pode ser usado como uma biblioteca python. Neste caso, o valor retornado será um dicionário python, uma lista de dicionários ou até mesmo um iterável preguiçoso de dicionários em vez 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 documentação do pacote
jc
Python, usehelp('jc')
,help('jc.lib')
ou consulte a documentação online.
Duas representações dos dados estão disponíveis. A representação padrão usa um esquema estrito por analisador e converte números conhecidos em valores JSON int/float. Certos valores conhecidos de None
são convertidos em JSON null
, valores booleanos conhecidos são convertidos e, em alguns casos, campos de contexto semântico adicionais são adicionados.
Para acessar o JSON bruto e pré-processado, use a opção -r
cli ou o parâmetro de função raw=True
em parse()
ao usar jc
como uma biblioteca python.
Esquemas para cada analisador podem ser encontrados no link da documentação ao lado de cada analisador abaixo.
As notas de lançamento podem ser encontradas na seção Releases no Github.
Para obter mais informações sobre as motivações deste projeto, consulte minha postagem no blog Trazendo a Filosofia Unix para o Século 21 e minha entrevista com o Console.
Veja também:
Casos de uso:
Existem várias maneiras de obter jc
. Você pode instalar via pip
, repositórios de pacotes do sistema operacional ou baixando o binário correto para sua arquitetura e executando-o em qualquer lugar do seu sistema de arquivos.
pip3 install jc
SO | Comando |
---|---|
Linux Debian/Ubuntu | apt-get install jc |
FedoraLinux | dnf install jc |
openSUSE linux | zypper install jc |
Arch linux | pacman -S jc |
Nix OS Linux | nix-env -iA nixpkgs.jc ou nix-env -iA nixos.jc |
Sistema Guix Linux | guix install jc |
GentooLinux | emerge dev-python/jc |
Fóton linux | tdnf install jc |
macOS | brew install jc |
FreeBSD | portsnap fetch update && cd /usr/ports/textproc/py-jc && make install clean |
Plug-in de filtro Ansible | ansible-galaxy collection install community.general |
Conector FortiSOAR | Instalar a partir do FortiSOAR Connector Marketplace |
Para mais pacotes de sistema operacional, consulte https://repology.org/project/jc/versions.
Para binários pré-compilados, consulte Lançamentos no Github.
jc
aceita entrada canalizada de STDIN
e gera uma representação JSON da saída do comando anterior para STDOUT
.
COMMAND | jc [SLICE] [OPTIONS] PARSER
cat FILE | jc [SLICE] [OPTIONS] PARSER
echo STRING | jc [SLICE] [OPTIONS] PARSER
Alternativamente, a sintaxe "mágica" pode ser usada acrescentando jc
ao comando a ser convertido ou na frente do caminho absoluto para arquivos Proc. As opções podem ser passadas para jc
imediatamente antes do comando ou do caminho do arquivo Proc ser fornecido. (Nota: aliases de comando e shell internos não são suportados)
jc [SLICE] [OPTIONS] COMMAND
jc [SLICE] [OPTIONS] /proc/ < path-to-procfile >
A saída JSON pode ser compacta (padrão) ou bem formatada com a opção -p
.
Argumento | Comando ou tipo de arquivo | Documentação |
---|---|---|
--acpi | analisador de comando acpi | detalhes |
--airport | airport -I comando analisador | detalhes |
--airport-s | analisador de comando airport -s | detalhes |
--apt-cache-show | analisador de comando apt-cache show | detalhes |
--apt-get-sqq | analisador de comando apt-get -sqq | detalhes |
--arp | analisador de comando arp | detalhes |
--asciitable | Analisador de tabelas ASCII e Unicode | detalhes |
--asciitable-m | analisador de tabelas ASCII e Unicode multilinha | detalhes |
--blkid | analisador de comando blkid | detalhes |
--bluetoothctl | analisador de comando bluetoothctl | detalhes |
--cbt | analisador de comandos cbt (Google Bigtable) | detalhes |
--cef | Analisador de string CEF | detalhes |
--cef-s | Analisador de streaming de string CEF | detalhes |
--certbot | analisador de comando certbot | detalhes |
--chage | analisador de comandos chage --list | detalhes |
--cksum | analisador de comandos cksum e sum | detalhes |
--clf | Analisador de arquivo de formato de log comum e combinado | detalhes |
--clf-s | Analisador de streaming de arquivo em formato de log comum e combinado | detalhes |
--crontab | Comando crontab e analisador de arquivos | detalhes |
--crontab-u | analisador de arquivo crontab com suporte ao usuário | detalhes |
--csv | Analisador de arquivo CSV | detalhes |
--csv-s | Analisador de streaming de arquivo CSV | detalhes |
--curl-head | analisador de comando curl --head | detalhes |
--date | analisador de comando date | detalhes |
--datetime-iso | Analisador de string de data e hora ISO 8601 | detalhes |
--debconf-show | analisador de comando debconf-show | detalhes |
--df | analisador de comando df | detalhes |
--dig | analisador de comando dig | detalhes |
--dir | analisador de comando dir | detalhes |
--dmidecode | analisador de comando dmidecode | detalhes |
--dpkg-l | analisador de comando dpkg -l | detalhes |
--du | du analisador de comando | detalhes |
--efibootmgr | analisador de comando efibootmgr | detalhes |
--email-address | Analisador de string de endereço de e-mail | detalhes |
--env | analisador de comando env | detalhes |
--ethtool | analisador de comando ethtool | detalhes |
--file | analisador de comando file | detalhes |
--find | find analisador de comando | detalhes |
--findmnt | analisador de comando findmnt | detalhes |
--finger | analisador de comando finger | detalhes |
--free | analisador de comando free | detalhes |
--fstab | analisador de arquivo /etc/fstab | detalhes |
--git-log | analisador de comando git log | detalhes |
--git-log-s | analisador de streaming do comando git log | detalhes |
--git-ls-remote | analisador de comando git ls-remote | detalhes |
--gpg | analisador de comando gpg --with-colons | detalhes |
--group | analisador de arquivo /etc/group | detalhes |
--gshadow | analisador de arquivo /etc/gshadow | detalhes |
--hash | analisador de comando hash | detalhes |
--hashsum | analisador de comando hashsum ( md5sum , shasum , etc.) | detalhes |
--hciconfig | analisador de comando hciconfig | detalhes |
--history | analisador de comando history | detalhes |
--host | analisador de comando host | detalhes |
--hosts | analisador de arquivo /etc/hosts | detalhes |
--http-headers | Analisador de cabeçalhos HTTP | detalhes |
--id | analisador de comando id | detalhes |
--ifconfig | analisador de comando ifconfig | detalhes |
--ini | Analisador de arquivo INI | detalhes |
--ini-dup | INI com analisador de arquivo de chave duplicado | detalhes |
--iostat | analisador de comando iostat | detalhes |
--iostat-s | analisador de streaming de comando iostat | detalhes |
--ip-address | Analisador de string de endereço IPv4 e IPv6 | detalhes |
--ipconfig | analisador de comando ipconfig do Windows | detalhes |
--iptables | analisador de comando iptables | detalhes |
--ip-route | analisador de comando ip route | detalhes |
--iw-scan | analisador de comando de iw dev [device] scan | detalhes |
--iwconfig | analisador de comando iwconfig | detalhes |
--jar-manifest | Analisador de arquivo Java MANIFEST.MF | detalhes |
--jobs | analisador de comando jobs | detalhes |
--jwt | Analisador de string JWT | detalhes |
--kv | Arquivo chave/valor e analisador de string | detalhes |
--kv-dup | Chave/Valor com arquivo de chave duplicado e analisador de string | detalhes |
--last | analisador de comandos last e lastb | detalhes |
--ls | analisador de comando ls | detalhes |
--ls-s | analisador de streaming de comando ls | detalhes |
--lsattr | analisador de comando lsattr | detalhes |
--lsb-release | analisador de comando lsb_release | detalhes |
--lsblk | analisador de comando lsblk | detalhes |
--lsmod | analisador de comando lsmod | detalhes |
--lsof | analisador de comando lsof | detalhes |
--lspci | analisador de comando lspci -mmv | detalhes |
--lsusb | analisador de comando lsusb | detalhes |
--m3u | Analisador de arquivos M3U e M3U8 | detalhes |
--mdadm | analisador de comando mdadm | detalhes |
--mount | analisador de comando de mount | detalhes |
--mpstat | analisador de comando mpstat | detalhes |
--mpstat-s | analisador de streaming de comando mpstat | detalhes |
--needrestart | analisador de comando needrestart -b | detalhes |
--netstat | analisador de comando netstat | detalhes |
--nmcli | analisador de comando nmcli | detalhes |
--nsd-control | analisador de comando nsd-control | detalhes |
--ntpq | analisador de comando ntpq -p | detalhes |
--openvpn | analisador de arquivo openvpn-status.log | detalhes |
--os-prober | analisador de comando os-prober | detalhes |
--os-release | analisador de arquivo /etc/os-release | detalhes |
--pacman | analisador de comando pacman | detalhes |
--passwd | analisador de arquivo /etc/passwd | detalhes |
--path | Analisador de string de caminho POSIX | detalhes |
--path-list | Analisador de strings da lista de caminhos POSIX | detalhes |
--pci-ids | analisador de arquivo pci.ids | detalhes |
--pgpass | Analisador de arquivo de senha PostgreSQL | detalhes |
--pidstat | analisador de comando pidstat -H | detalhes |
--pidstat-s | analisador de streaming de comando pidstat -H | detalhes |
--ping | analisador de comando ping e ping6 | detalhes |
--ping-s | analisador de streaming de comando ping e ping6 | detalhes |
--pip-list | analisador de comando pip list | detalhes |
--pip-show | analisador de comando pip show | detalhes |
--pkg-index-apk | Analisador de arquivo Alpine Linux Package Index | detalhes |
--pkg-index-deb | Analisador de arquivos de índice de pacotes Debian | detalhes |
--plist | Analisador de arquivo PLIST | detalhes |
--postconf | analisador de comando postconf -M | detalhes |
--proc | /proc/ analisador de arquivo | detalhes |
--ps | analisador de comando ps | detalhes |
--resolve-conf | Analisador de arquivo /etc/resolve.conf | detalhes |
--route | analisador de comando route | detalhes |
--rpm-qi | analisador de comando rpm -qi | detalhes |
--rsync | analisador de comando rsync | detalhes |
--rsync-s | analisador de streaming de comando rsync | detalhes |
--semver | Analisador de string de versão semântica | detalhes |
--sfdisk | analisador de comando sfdisk | detalhes |
--shadow | analisador de arquivo /etc/shadow | detalhes |
--srt | Analisador de arquivo SRT | detalhes |
--ss | analisador de comando ss | detalhes |
--ssh-conf | arquivo de configuração ssh e analisador de comando ssh -G | detalhes |
--sshd-conf | arquivo de configuração sshd e analisador de comando sshd -T | detalhes |
--stat | analisador de comando stat | detalhes |
--stat-s | analisador de streaming de comando stat | detalhes |
--swapon | analisador de comando swapon | detalhes |
--sysctl | analisador de comando sysctl | detalhes |
--syslog | Analisador de string Syslog RFC 5424 | detalhes |
--syslog-s | Analisador de streaming de string Syslog RFC 5424 | detalhes |
--syslog-bsd | Analisador de string Syslog RFC 3164 | detalhes |
--syslog-bsd-s | Analisador de streaming de string Syslog RFC 3164 | detalhes |
--systemctl | analisador de comando systemctl | detalhes |
--systemctl-lj | analisador de comando systemctl list-jobs | detalhes |
--systemctl-ls | analisador de comando systemctl list-sockets | detalhes |
--systemctl-luf | analisador de comando systemctl list-unit-files | detalhes |
--systeminfo | analisador de comando systeminfo | detalhes |
--time | analisador de comando /usr/bin/time | detalhes |
--timedatectl | analisador de comando timedatectl status | detalhes |
--timestamp | Analisador de string Unix Epoch Timestamp | detalhes |
--toml | Analisador de arquivo TOML | detalhes |
--top | analisador de comando top -b | detalhes |
--top-s | analisador de streaming de comando top -b | detalhes |
--tracepath | analisador de comandos tracepath e tracepath6 | detalhes |
--traceroute | analisador de comando traceroute e traceroute6 | detalhes |
--tune2fs | analisador de comando tune2fs -l | detalhes |
--udevadm | analisador de comando udevadm info | detalhes |
--ufw | analisador de comando ufw status | detalhes |
--ufw-appinfo | analisador de comando ufw app info [application] | detalhes |
--uname | uname -a analisador de comando | detalhes |
--update-alt-gs | analisador de comando update-alternatives --get-selections | detalhes |
--update-alt-q | analisador de comando update-alternatives --query | detalhes |
--upower | analisador de comando upower | detalhes |
--uptime | analisador de comando uptime | detalhes |
--url | Analisador de string de URL | detalhes |
--ver | Analisador de string de versão | detalhes |
--veracrypt | analisador de comando veracrypt | detalhes |
--vmstat | analisador de comando vmstat | detalhes |
--vmstat-s | analisador de streaming de comando vmstat | detalhes |
--w | w analisador de comando | detalhes |
--wc | analisador de comando wc | detalhes |
--wg-show | analisador de comando wg show | detalhes |
--who | who comanda o analisador | detalhes |
--x509-cert | Analisador de arquivo de certificado X.509 PEM e DER | detalhes |
--x509-csr | Analisador de arquivo de solicitação de certificado X.509 PEM e DER | detalhes |
--xml | Analisador de arquivo XML | detalhes |
--xrandr | analisador de comando xrandr | detalhes |
--yaml | Analisador de arquivo YAML | detalhes |
--zipinfo | analisador de comando zipinfo | detalhes |
--zpool-iostat | analisador de comando zpool iostat | detalhes |
--zpool-status | analisador de comando zpool status | detalhes |
Curto | Longo | Descrição |
---|---|---|
-a | --about | Sobre jc . Imprime informações sobre jc e os analisadores (em JSON ou YAML, é claro!) |
-C | --force-color | Força a saída de cores mesmo ao usar tubos (substitui -m e a variável NO_COLOR env) |
-d | --debug | Modo de depuração. Imprime mensagens de rastreamento se forem encontrados problemas de análise (use -dd para depuração detalhada) |
-h | --help | Ajuda. Use jc -h --parser_name para documentação do analisador. Use duas vezes para mostrar analisadores ocultos (por exemplo, -hh ). Use três vezes para mostrar as categorias do analisador (por exemplo, -hhh ). |
-m | --monochrome | Saída monocromática |
-M | --meta-out | Adicione metadados à saída, incluindo carimbo de data/hora, nome do analisador, comando mágico, código de saída do comando mágico, etc. |
-p | --pretty | Formate bem a saída JSON |
-q | --quiet | Modo silencioso. Suprime mensagens de aviso do analisador (use -qq para ignorar erros do analisador de streaming) |
-r | --raw | Saída bruta. Fornece saída mais literal, normalmente com valores de string e sem processamento semântico adicional |
-s | --slurp | Coloque várias linhas em um array. (use -hhh para encontrar analisadores compatíveis) |
-u | --unbuffer | Saída sem buffer |
-v | --version | Informações de versão |
-y | --yaml-out | Saída YAML |
-B | --bash-comp | Gerar script de conclusão do shell Bash (mais informações) |
-Z | --zsh-comp | Gerar script de conclusão do shell Zsh (mais informações) |
O fatiamento de linha é suportado usando a sintaxe START:STOP
semelhante ao fatiamento do Python. Isso permite pular linhas no início e/ou final da entrada STDIN
que você gostaria que jc
convertesse.
START
e STOP
podem ser números inteiros positivos ou negativos ou espaços em branco e permitem especificar quantas linhas pular e quantas linhas processar. Fatias positivas e em branco são as mais eficientes em termos de memória. Quaisquer números inteiros negativos na fatia usarão mais memória.
Por exemplo, para pular a primeira e a última linha do texto a seguir, você poderia expressar a fatia de duas maneiras:
$ 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 " }]
Neste exemplo, as fatias de linha 1:-1
e 1:4
fornecem a mesma saída.
Ao usar números inteiros positivos, a localização do índice STOP
não é inclusiva. As fatias positivas contam desde a primeira linha da entrada até o final, começando em 0
como a primeira linha. As fatias negativas contam da última linha até o início, começando em -1
como a última linha. É também assim que funciona o recurso de fatiamento do Python.
Aqui está uma análise das opções de fatia de linha:
Notação de fatia | Linhas de entrada processadas |
---|---|
START:STOP | linhas START a STOP - 1 |
START: | linhas START pelo resto da saída |
:STOP | linhas desde o início até STOP - 1 |
-START:STOP | Linhas START do final até STOP - 1 |
START:-STOP | linhas START até STOP linhas do final |
-START:-STOP | Linhas START do final até linhas STOP do final |
-START: | Linhas START do final até o resto da saída |
:-STOP | linhas do início até linhas STOP do final |
: | todas as linhas |
Alguns analisadores suportam entrada de vários itens e podem gerar uma série de resultados em uma única passagem. Slurping funciona para analisadores de strings que aceitam uma única linha de entrada. (por exemplo, url
e ip-address
) Para ver uma lista de analisadores que suportam a opção --slurp
, use jc -hhh
.
Por exemplo, você pode enviar um arquivo com vários endereços IP (um por linha) para jc
com a opção --slurp
e uma série de resultados será exibida:
$ cat ip-addresses.txt | jc --slurp --ip-address
[ < multiple output objects > ]
A sintaxe mágica para arquivos /proc
suporta automaticamente a extração de vários arquivos (não há necessidade de usar a opção --slurp
). Por exemplo, você pode converter muitos arquivos PID de uma vez:
$ jc /proc/ * /status
[ < multiple output objects > ]
Quando a sintaxe mágica /proc
é usada e vários arquivos são selecionados, um campo _file
adicional é inserido na saída para que seja mais fácil saber a qual arquivo cada objeto de saída se refere.
Finalmente, a opção --meta-out
pode ser usada em conjunto com a saída sugada. Neste caso, a saída sugada é envolvida em um objeto com a seguinte estrutura:
{
"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 "
]
}
}
Com --meta-out
, input_list
contém uma lista de entradas (strings de entrada reais ou nomes de arquivos /proc
) para que você possa identificar qual objeto de saída está relacionado a cada string de entrada ou nome de arquivo /proc
.
Quaisquer erros fatais em jc
gerarão um código de saída 100
, caso contrário, o código de saída será 0
.
Ao usar a sintaxe "mágica" (por exemplo, jc ifconfig eth0
), jc
armazenará o código de saída do programa que está sendo analisado e o adicionará ao código de saída jc
. Dessa forma, é mais fácil determinar se um erro veio do programa analisado ou jc
.
Considere os seguintes exemplos usando ifconfig
:
código de saída ifconfig | código de saída jc | Código de saída combinado | Interpretação |
---|---|---|---|
0 | 0 | 0 | Sem erros |
1 | 0 | 1 | Erro no ifconfig |
0 | 100 | 100 | Erro em jc |
1 | 100 | 101 | Erro no ifconfig e no jc |
Ao usar a sintaxe "mágica", você também pode recuperar o código de saída do programa chamado usando a opção --meta-out
ou -M
. Isso acrescentará um objeto _jc_meta
à saída que incluirá as informações do comando mágico, incluindo o código de saída.
Aqui está um exemplo com 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
Você pode especificar cores personalizadas por meio da variável de ambiente JC_COLORS
. A variável de ambiente JC_COLORS
usa quatro valores de string separados por vírgula no seguinte formato:
JC_COLORS= < keyname_color > , < keyword_color > , < number_color > , < string_color >
Onde as cores são: black
, red
, green
, yellow
, blue
, magenta
, ciano , cyan
, gray
brightblack
, vermelho brightred
, brightgreen
, brightyellow
, brightblue
brightmagenta
brightcyan
, white
ou default
Por exemplo, para definir as cores padrão:
JC_COLORS=blue,brightblack,magenta,green
ou
JC_COLORS=default,default,default,default
Você pode definir a variável de ambiente NO_COLOR
para qualquer valor para desabilitar a saída de cores em jc
. Observe que usar a opção -C
para forçar a saída de cores substituirá a variável de ambiente NO_COLOR
e a opção -m
.
A maioria dos analisadores carrega todos os dados de STDIN
, analisa-os e, em seguida, gera todo o documento JSON em série. Existem alguns analisadores de streaming (por exemplo, ls-s
e ping-s
) que imediatamente iniciam o processamento e a saída dos dados linha por linha como linhas JSON (também conhecidas como NDJSON) enquanto estão sendo recebidos de STDIN
. Isso pode reduzir significativamente a quantidade de memória necessária para analisar grandes quantidades de saída de comando (por exemplo, ls -lR /
) e às vezes pode processar os dados mais rapidamente. Os analisadores de streaming têm um comportamento ligeiramente diferente dos analisadores padrão, conforme descrito abaixo.
Nota: Os analisadores de streaming não podem ser usados com a sintaxe "mágica"
Talvez você queira ignorar os erros de análise ao usar analisadores de streaming, pois eles podem ser usados em pipelines de processamento de longa duração e os erros podem quebrar o canal. Para ignorar erros de análise, use a opção -qq
cli ou o argumento ignore_exceptions=True
com a função parse()
. Isso adicionará um objeto _jc_meta
à saída JSON com um atributo success
. Se success
for true
, não houve problemas ao analisar a linha. Se success
for false
, um problema de análise foi encontrado e os campos error
e line
serão adicionados para incluir uma breve descrição do erro e o conteúdo da linha não analisável, respectivamente:
Linha analisada com sucesso com a opção -qq
:
{
"command_data" : " data " ,
"_jc_meta" : {
"success" : true
}
}
Linha analisada sem sucesso com a opção -qq
:
{
"_jc_meta" : {
"success" : false ,
"error" : " error message " ,
"line" : " original line data "
}
}
A maioria dos sistemas operacionais armazena em buffer a saída que está sendo canalizada de um processo para outro. O buffer geralmente tem cerca de 4 KB. Ao visualizar a saída no terminal, o buffer do sistema operacional não está ativado, então a saída é imediatamente exibida na tela. Porém, ao canalizar vários processos juntos, pode parecer que a saída está suspensa quando os dados de entrada são muito lentos (por exemplo, ping
):
$ ping 1.1.1.1 | jc --ping-s | jq
Isso ocorre porque o sistema operacional utiliza o buffer de 4 KB entre jc
e jq
neste exemplo. Para exibir os dados no terminal em tempo real, você pode desabilitar o buffer com a opção -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: A saída sem buffer pode ser mais lenta para grandes fluxos de dados.
Os analisadores de streaming aceitam qualquer objeto iterável e retornam um objeto iterável, permitindo o processamento lento dos dados. Os dados de entrada devem iterar em linhas de dados de string. Exemplos de bons dados de entrada são sys.stdin
ou str.splitlines()
.
Para usar o objeto iterável retornado em seu código, simplesmente faça um loop nele ou use a função interna next():
import jc
result = jc . parse ( 'ls_s' , ls_command_output . splitlines ())
for item in result :
print ( item [ "filename" ])
Os plug-ins do analisador podem ser colocados em uma pasta jc/jcparsers
em seu "Diretório de dados do aplicativo" local:
$HOME/.local/share/jc/jcparsers
$HOME/Library/Application Support/jc/jcparsers
$LOCALAPPDATAjcjcjcparsers
Os plug-ins do analisador são arquivos de módulo python padrão. Use o analisador jc/parsers/foo.py
ou jc/parsers/foo_s.py (streaming)
como modelo e simplesmente coloque um arquivo .py
na subpasta jcparsers
. Quaisquer dependências podem ser colocadas na pasta jc
acima de jcparsers
e podem ser importadas no código do analisador.
Os nomes de arquivos do plug-in do analisador devem ser nomes de módulos python válidos e, portanto, devem começar com uma letra e consistir inteiramente em caracteres alfanuméricos e sublinhados. Plugins locais podem substituir analisadores padrão.
Nota: O diretório de dados do aplicativo segue a especificação do diretório base XDG
Para obter melhores resultados, defina as variáveis de ambiente de localidade como C
ou en_US.UTF-8
modificando a variável LC_ALL
:
$ LC_ALL=C date | jc --date
Você também pode definir as variáveis de localidade individualmente:
$ export LANG=C
$ export LC_NUMERIC=C
Em alguns sistemas mais antigos, a saída UTF-8 será rebaixada para ASCII com sequências de escape \u
se o código de idioma C
não suportar a codificação UTF-8.
Alguns analisadores calcularam campos de carimbo de data/hora de época adicionados à saída. A menos que o nome de um campo de carimbo de data/hora tenha um sufixo _utc
, ele é considerado ingênuo. (ou seja, com base no fuso horário local do sistema em que o analisador jc
foi executado).
Se um fuso horário UTC puder ser detectado no texto da saída do comando, o carimbo de data/hora reconhecerá o fuso horário e terá um sufixo _utc
no nome da chave. (por exemplo, epoch_utc
) Nenhum outro fuso horário é suportado para carimbos de data/hora conscientes.
jc
pode ser usado em quase todos os shells. Alguns shells modernos possuem recursos integrados de desserialização e filtragem de JSON, o que torna o uso de jc
ainda mais conveniente.
Por exemplo, o seguinte é possível no NGS (Next Generation Shell):
myvar = ` ` jc dig www.google.com ` ` [0].answer[0].data
Isso executa jc
, analisa o JSON de saída e atribui a estrutura de dados resultante a uma variável em uma única linha de código.
Para obter mais exemplos de como usar jc
em outros shells, consulte esta página wiki.
Alguns analisadores como dig
, xml
, csv
, etc. funcionarão em qualquer plataforma. Outros analisadores que convertem a saída específica da plataforma gerarão uma mensagem de aviso se forem executados em uma plataforma não suportada. Para ver todas as informações do analisador, incluindo compatibilidade, execute jc -ap
.
Você ainda pode usar um analisador em uma plataforma não suportada - por exemplo, você pode querer analisar um arquivo com saída linux lsof
em um laptop macOS ou Windows. Nesse caso, você pode suprimir a mensagem de aviso com a opção -q
cli ou o parâmetro de função quiet=True
em parse()
:
macOS:
cat lsof.out | jc -q --lsof
ou janelas:
type lsof.out | jc -q --lsof
Testado em:
Sinta-se à vontade para adicionar/melhorar código ou analisadores! Você pode usar os analisadores jc/parsers/foo.py
ou jc/parsers/foo_s.py (streaming)
como modelo e enviar seu analisador com uma solicitação pull.
Consulte as Diretrizes de Contribuição para obter mais informações.
ifconfig-parser
por KnightWhoSayNixmltodict
por Martín Blechruamel.yaml
por Anthon van der Neuttrparse
por Luis Benitez Aqui estão alguns exemplos de saída jc
. Para mais exemplos, veja aqui ou a documentação do analisador.
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