Skip to content

Instantly share code, notes, and snippets.

@diogotito
Last active October 23, 2023 22:31
Show Gist options
  • Save diogotito/1ce42f1d351d04cb66f07775cc10cd71 to your computer and use it in GitHub Desktop.
Save diogotito/1ce42f1d351d04cb66f07775cc10cd71 to your computer and use it in GitHub Desktop.
[pt] Apontamentos jq

jq

Created segunda-feira 28 junho 2021 @cheatsheet

Flags úteis

  • -s (slurp) "sorve" um fluxo de vários documentos JSON (AKA "JSON Lines") para uma array. O filtro só recebe esta array.
  • -r (raw) Se o meu filtro produzir uma stream de strings, isto tira as aspas no output. Útil para passar para outros comandos.
  • -C (colors) Combina bem com less -r

Features úteis

  • String interplation: "\(.filtro.aqui)" É muito fixe com -r em shell scripts!!
  • .[], also, dá para fatiar arrays e usar indexes negativos
  • to_entries | map | from_entries

Não esquecer

  • CHAMA-SE select (filter/1 não existe. Ah, e se for com uma array deve ser … | map(select(…)))
  • Posso indexar arrays quase como em Python (ex.: .[-1])

Outras cenas que também têm a haver com JSON ou jq

  • jid — Explorar JSON interativamente no terminal, com uma sintaxe parecida à do jq mas limitada a member operators (. e [])

  • jiq — jid, mas com jq!

  • gron — Torna input em JSON "grep"-ável. Traz um ungron para fazer pipelines com outras ferramentas que trabalham com streams de texto.

  • Jo — A shell command to create JSON (HN)

  • jless — a command-line JSON viewer -- muitos vim-like commands para explorar um JSON, parece muito fixe de se ter!!

  • fx — a command-line JSON viewer — mesma coisa [Go] que também permite escrever Reducers em JavaScript, Python ou Ruby

  • JJ — JSON Stream Editor — Written in Go, com desempenho fixe para operações mais simples

  • Há um playground online: https://jqplay.org/

  • Há uma extensão fixe para se trabalhar com jq no Visual Studio Code

  • Para iterar mais rapidamente na linha de comandos:

    • up — Ultimate Plumber
    • Alt + A no ZSH
  • fq — jq for binary formats — tool, language and decoders for working with binary and text formats

  • kellyjonbrazil/jc — CLI tool and python library that converts the output of popular command-line tools and file-types to JSON or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.

  • PowerShell!! ConvertTo/From-Json

Para HTML

  • xidel — Seletores de CSS, XPath e XQuery 3.0
  • htmlq — Só seletores de CSS
    • Mas isto é mais parecido a um grep para HTML do que a um jq, que por sua vez é mais um awk "generator-oriented" para JSON
  • xmlstarlet — para XML
  • xml2 — Algo ainda melhor para XML

Features por experimentar

  • Alternative operator: //
  • try-catch: try EXP catch EXP
  • Update-assignment: |= vs. plain assignment: =
    • Append to an array: .posts[].comments |= . + ["this is great"]
    • Any filter may be used on the left-hand side of an equals *

Cenas que fiz uma vez na linha de comandos em que usei features menos triviais do jq

docker events --since '2021-06-24' --until 10h --format='{{json .}}'
	| head
	| jq -C '
		select(.Type == "network")
			| .time |= (gmtime | strftime("%d/%m (%A) %H:%M"))
			| del(.timeNano, .scope)
//            ^ Aqui teria sido melhor fazer {propriedades, que, me, interessam}
	'
	| less -r
❯ curl -s 'http://192.168.0.1/goform/goform_get_cmd_process?cmd=station_list'
       -e http://192.168.0.1/index.html
    | jq -r '((.[][0] | keys_unsorted) , (.[][] | map(.))) | @tsv'
    | column -t
    
#----------------------------------------------
# Resposta do router:
#----------------------------------------------
{"station_list":[{"mac_addr":"50:b7:c3:5c:8e:04","hostname":"samsung-arch","ip_addr":"192.168.0.115"},{"mac_addr":"84:5c:f3:2a:56:98","hostname":"PTLAP0876","ip_addr":"192.168.0.116"},{"mac_addr":"c2:d6:83:8c:09:7c","hostname":"iPhoneFatima","ip_addr":"192.168.0.113"},{"mac_addr":"f4:f5:d8:ea:1a:ee","hostname":"Chromecast","ip_addr":"192.168.0.161"}]}

#----------------------------------------------
# Output final:
#----------------------------------------------
mac_addr           hostname      ip_addr
50:b7:c3:5c:8e:04  samsung-arch  192.168.0.115
84:5c:f3:2a:56:98  PTLAP0876     192.168.0.116
c2:d6:83:8c:09:7c  iPhoneFatima  192.168.0.113
f4:f5:d8:ea:1a:ee  Chromecast    192.168.0.161

Inspirado nesta resposta: https://stackoverflow.com/questions/39139107/how-to-format-a-json-string-as-a-table-using-jq/54854136#54854136

Wow

jqjq — jq escrito em jq, pelo criador do fq

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment