Eu tenho alguns logs de um serviço da web em uma máquina Linux. Os logs ficam assim:
{"log":"[2023-03-09T06:39:10.669Z] \"GET /server/prod?blank=true HTTP/1.1\" 200 - 0 874 1 1 \"-\" \"-\" \"aaad-bbb-ccc-dd-eeeee\" \"example.com:22213\" \"172.16.2.1:10080\"\n","stream":"stdout","time":"2023-03-09T06:39:11.935831787Z"}
Como você pode ver, existem algumas aspas duplas. Preciso imprimir o conteúdo entre a terceira e a quarta aspas duplas e entre a 11ª e a 12ª aspas duplas. O que significa que eu quero obter o conteúdo conforme abaixo:
"GET /server/prod?blank=true HTTP/1.1\" "example.com:22213\"
Eu só me importo com o conteúdo. Eu não me importo "
ou \
.
Usando
jq
, você pode extrair e decodificar o valor dalog
chave:Este é essencialmente um registro CSV sem cabeçalho usando um caractere de espaço como separador de campo, então podemos usar uma ferramenta compatível com CSV como Miller (
mlr
) para analisar o segundo e o décimo segundo campo a partir disso:Para facilitar a análise, você pode usar o formato de saída TSV:
As aspas são removidas automaticamente por Miller, pois o primeiro campo não contém mais delimitadores incorporados.
Observe a alteração de
--csv
para--c2t
(o mesmo que--icsv
junto com--otsv
) e também de--fs
para--ifs
(configura apenas o separador de campo de entrada , não o separador de campo de saída). Nesse caso, mudar--fs space
para--ifs space --ofs tab
teria o mesmo efeito, pois Miller trata TSV e CSV da mesma forma (é apenas o separador de campo que é diferente).Pela minha conta, você quer o texto entre a quarta e a quinta aspas duplas e depois entre a décima segunda e a décima terceira:
(usando
sed
com suporte para expressões regulares estendidas como GNU, vários BSDs ou Busybox) ou(usando qualquer
sed
).Um
awk
script de amostra pode fazer o trabalho. Isso usa o"
caractere como separador de campo, então o primeiro campo ($1
) é a parte antes do primeiro"
etc.Se você quiser remover as barras invertidas também, pode fazer isso, por exemplo,
gsub()
no script: