A questão da jq
necessidade de um filtro explícito quando a saída é redirecionada é discutida em toda a web. Mas não consigo redirecionar a saída se fizer jq
parte de uma cadeia de tubulação, mesmo quando um filtro explícito estiver em uso.
Considerar:
touch in.txt
tail -f in.txt | jq '.f1'
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Como esperado, a saída no terminal original do jq
comando é:
1
3
Mas se eu adicionar qualquer tipo de redirecionamento ou canalização ao final do jq
comando, a saída ficará silenciosa:
rm in.txt
touch in.txt
tail -f in.txt | jq '.f1' | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
Nenhuma saída aparece no primeiro terminal e o out.txt está vazio.
Eu tentei centenas de variações, mas é uma questão ilusória. A única solução alternativa que encontrei , como foi descoberta na mosquitto_sub
The Things Network (onde também descobri o problema), é agrupar as funções tail e jq em um script de shell:
#!/bin/bash
tail -f $1 | while IFS='' read line; do
echo $line | jq '.f1'
done
Então:
./tail_and_jq.sh | tee out.txt
# in a different terminal:
echo '{"f1":1,"f2":2}' >> in.txt
echo '{"f1":3,"f2":2}' >> in.txt
E com certeza, a saída aparece:
1
3
Isto é com o mais recente jq
instalado via Homebrew:
$ echo $SHELL
/bin/bash
$ jq --version
jq-1.5
$ brew install jq
Warning: jq 1.5_3 is already installed and up-to-date
Isso é um bug (em grande parte não documentado) no jq
ou com meu entendimento das correntes de tubulação?
tail -f logfile | grep 'foo bar' | awk ...
tail
surgiu dos esforços para quebrar o canal (execute o primeiro comando, tee e redirecione para arquivo, siga-o, canalize para o próximo comando, redirecione para arquivo, etc.) e execute-o continuamente em seções. A <
é uma boa ferramenta para se ter em mente.
tail -f
para fornecer entrada contínua a um programa etee
processar a saída. Se você ainda precisasse de uma resposta, eu sugeriria simplificar a cadeia para<in.json jq '.f1' >out.json
que você pudesse restringir o que está causando isso.