Você tem vários problemas aqui
-
systemnã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
$2contiver caracteres especiais como$, seu shell os interpretará - mesmo com a cotação correta,
jqnã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
$2fosse; 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
$2contiver uma aspa simples, ele quebrará o comando inteiro - se
$2começar com um traço (improvável), ele será interpretado como uma opção paraecho(podemos usar o comandoprintfem vez deecho) - o problema de segurança já mencionado (por exemplo, se
$2contiver...'; 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() .