>_ josetilabs.com
← blog

23 out 2026 · ferramentas, json, terminal · 5 min

Como consultar JSON no terminal com jq

jq é um filtro de linha de comando para JSON: lê da entrada, aplica uma expressão, imprime o resultado. Com um arquivo de quatro serviços, extrair os nomes, filtrar por status, ordenar por memória, somar e converter para CSV são cinco comandos de uma linha. Medido em 20.000 registros: filtrar leva 0,072 s com jq contra 0,071 s com Python; agrupar leva 0,147 s contra 0,069 s.

O que o jq faz

O jq não é um editor de JSON nem um banco. Ele recebe um documento JSON, aplica uma expressão e imprime o resultado em JSON, texto ou CSV. A expressão mais simples é ., que imprime o documento inteiro formatado. A partir dela, encadeia filtros com |, como num shell.

A saída padrão é JSON formatado. Para obter texto puro, use a flag -r (raw). Para CSV, use @csv dentro da expressão. É essa combinação que torna o jq útil em scripts: uma linha substitui dezenas de linhas de Python.

Terminal com cinco consultas jq sobre um JSON de 4 serviços: nomes, filtro por status up, top 2 por memória, soma de memória e saída em csv
Cinco consultas sobre o mesmo arquivo. A saída raw (-r) tira as aspas.

Os cinco filtros que cobrem 90% do uso

Extraia um campo de cada elemento:

bash
jq -r '.[].nome' servicos.json

Filtre por condição:

bash
jq -r '.[] | select(.status == "up") | .nome' servicos.json

Ordene e pegue os primeiros:

bash
jq 'sort_by(.mem_mb) | reverse | .[0:2] | .[].nome' servicos.json

Agregue:

bash
jq '[.[].mem_mb] | add' servicos.json

Converta para CSV:

bash
jq -r '.[] | [.id, .nome, .cpu, .mem_mb, .status] | @csv' servicos.json

O ponto que mais confunde quem começa: .[] percorre o array, mas select precisa vir depois do |, porque filtra elemento por elemento. sort_by e reverse operam sobre o array inteiro, por isso vêm antes do .[0:2].

Gráfico de barras com o tempo em segundos para filtrar e agrupar 20000 registros JSON: jq 0.072 s e 0.147 s, python 0.071 s e 0.069 s
Filtrar é empate; agrupar, Python ganha. O jq vence no tempo de digitar.

O artefato: um script que roda os cinco

O consultar-json.sh abaixo roda as cinco consultas contra qualquer arquivo JSON no formato do exemplo. Se o jq não estiver instalado, ele avisa e sai com código 0, sem quebrar um pipeline. Se nenhum arquivo for passado, usa o exemplo embutido.

bash
#!/usr/bin/env bash
# consultar-json.sh: as cinco consultas jq que cobrem a maior parte do uso.
# uso: bash consultar-json.sh [arquivo.json]
# sem arquivo, usa o exemplo embutido. sai 0 mesmo sem jq instalado.

if ! command -v jq >/dev/null 2>&1; then
  echo "jq nao encontrado: instale com 'apt install jq' ou 'brew install jq'"
  exit 0
fi

if [ -n "${1:-}" ] && [ -f "$1" ]; then
  arquivo="$1"
else
  arquivo=$(mktemp)
  cat > "$arquivo" <<'JSON'
[
  {"id": 1, "nome": "web", "cpu": 0.4, "mem_mb": 120, "status": "up"},
  {"id": 2, "nome": "api", "cpu": 1.2, "mem_mb": 340, "status": "up"},
  {"id": 3, "nome": "db", "cpu": 0.1, "mem_mb": 1024, "status": "up"},
  {"id": 4, "nome": "cache", "cpu": 0.0, "mem_mb": 64, "status": "down"}
]
JSON
fi

echo "== nomes =="
jq -r '.[].nome' "$arquivo"

echo "== servicos ativos =="
jq -r '.[] | select(.status == "up") | .nome' "$arquivo"

echo "== dois maiores por memoria =="
jq 'sort_by(.mem_mb) | reverse | .[0:2] | .[].nome' "$arquivo"

echo "== memoria total =="
jq '[.[].mem_mb] | add' "$arquivo"

echo "== csv =="
jq -r '.[] | [.id, .nome, .cpu, .mem_mb, .status] | @csv' "$arquivo"

Como verificar

Instale o jq e rode o script contra o exemplo:

bash
apt install jq        # debian/ubuntu
brew install jq       # macos
bash consultar-json.sh

Saída esperada: quatro nomes na primeira seção, três ativos na segunda, db e api na terceira, 1548 na quarta e quatro linhas CSV na última. Se o jq não estiver instalado, o script imprime a instrução de instalação e sai com código 0, sem quebrar um pipeline.

Para validar a sintaxe de uma expressão sem rodar sobre dados grandes, use --null-input:

bash
jq -n '1 + 2'

Se der errado

parse error: Invalid numeric literal. O JSON de entrada tem erro de sintaxe, geralmente uma vírgula sobrando ou aspas simples. Valide antes com jq empty arquivo.json: se houver erro, ele aponta a linha.

Cannot index string with string "nome". A expressão assumiu um array, mas o documento é um objeto. Verifique a estrutura com jq 'type' arquivo.json e ajuste o filtro: .items[].nome em vez de . [].nome.

jq: command not found em CI. A imagem base do contêiner não tem jq. Instale no Dockerfile com apt-get install -y jq, ou use a imagem stedolan/jq para processar arquivos em pipeline. Não tente chamar jq num contêiner python:slim sem instalá-lo.

Saída com aspas quando você queria texto. Faltou a flag -r. Sem ela, strings saem com aspas, o que quebra pipes para outros comandos.

Tabela comparativa

Ferramenta Força Fraqueza
jq Uma linha por consulta, saída formatada Sintaxe própria para aprender
Python + json Conhecido por quem já programa Verboso para filtros simples
grep/sed Rápido em texto simples Quebra com JSON aninhado ou com espaços
fx/jless Interface interativa Precisa de TTY, não serve em script

grep funciona enquanto o JSON for simples e formatado numa linha. No momento em que aparece um campo aninhado ou um valor com vírgula, ele mente. O jq é a aposta segura em script.

FAQ

O jq altera o arquivo original? Não. Ele lê da entrada e escreve na saída. Para sobrescrever, redirecione: jq '.[] | .nome = "x"' arquivo.json > tmp && mv tmp arquivo.json. Nunca use > arquivo.json no mesmo comando, porque o shell trunca o arquivo antes do jq ler.

Posso usar jq em JSON Lines (um objeto por linha)? Sim. Use a flag -s para slurp (lê tudo num array) ou processe linha a linha sem -s. Para NDJSON, jq -c '.' emite um objeto por linha, útil para alimentar outros comandos.

Qual a diferença entre jq e yq? O jq é para JSON. O yq aplica a mesma ideia a YAML, XML e TOML. A sintaxe é parecida, mas não idêntica. Se o seu dado é JSON, use jq.

O jq é rápido o suficiente para arquivos grandes? Para arquivos até alguns megabytes, sim. Acima disso, considere jaq (implementação em Rust, mais rápida) ou gojq. Para gigabytes, use um banco ou ferramenta de streaming.

Como depurar uma expressão longa? Quebre em etapas: rode jq '.[]' primeiro, depois jq '.[] | select(...)', depois adicione o | .campo. O jq imprime o resultado de cada etapa se você parar no |.

Fontes

Veja também curl na prática: testar api, ver cabeçalho e medir tempo e servidores MCP prontos para conectar no seu agente.

Leia também

// Por e-mail

Os textos publicados aqui também vão por e-mail. O envio ainda não começou: quem deixar o endereço agora entra na primeira lista.

Guardo só o seu e-mail, a data e o registro desta autorização. Sem cookies, sem rastreador e nada compartilhado com terceiros. Detalhes na política de privacidade.