Você tem vários problemas aqui
-
system
não retorna algo para imprimir, ele retorna o valor de saída do comando que você executou (0 se tudo correu com multas). Você verá seus dados decodificados em JSON e, em seguida, uma linha comoHello earth 0
- as aspas duplas na string JSON são engolidas pelo shell. O comando resultante que você está executando é
jq {foo: bar}
(dois argumentos, JSON não são mais citados) - se
$2
contiver caracteres especiais como$
, seu shell os interpretará - mesmo com a cotação correta,
jq
não é chamado assim, espera um filtro como primeiro argumento (digamos '.
') e espera que a entrada JSON seja lida de um arquivo ou da entrada padrão - criar um comando a partir dos logs e executá-lo tem uma enorme implicação de segurança (e se
$2
fosse; rm -rf ~
?). É melhor evitá-lo, se puder.
O problema de segurança reservado, aqui está um código awk
que funcionará na maioria das vezes:
awk -F "|" '{ printf "%s", $1; system("echo \x27" $2 "\x27 | jq .")}'
O que ele faz é enviar $2
entre aspas simples ( \x27
) para jq
através de stdin.
Problemas permanecem, embora
- se
$2
contiver uma aspa simples, ele quebrará o comando inteiro - se
$2
começar com um traço (improvável), ele será interpretado como uma opção paraecho
(podemos usar o comandoprintf
em vez deecho
) - o problema de segurança já mencionado (por exemplo, se
$2
contiver...'; rm -r ~; : ' ...
em qualquer lugar da string)
Agora, um melhor awk
code
awk -F "|" '{ printf "%s", $1; print $2 | "jq ."; close("jq ."); }'
Como $2
é enviado para um processo jq
através de stdin, mas agora usando um awk
pipe, ele não é mais interpretado pelo shell, resolvendo todos os problemas acima. O comando jq
deve ser fechado (terminado) em cada linha, portanto, a chamada para close()
.