Estou tentando obter a data de alguns logs em um determinado formato para fazer algumas comparações posteriormente. Aqui está meu comando:
fgrep "<expression>" <logFile> | sort | awk -F "[][]" 'messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S") { print messageDate }'
O que me é impresso são as linhas completas dos arquivos de log.
Se em vez disso eu executar isto:
fgrep "<expression>" <logFiles> | sort | awk -F "[][]" 'messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S") { print $2 }'
Recebo as datas, mas não no formato que desejo.
2014-09-04T08:22:16Z
2017-10-08T16:05:06Z
2022-11-30T14:50:16Z
Os arquivos de log têm mensagens como esta:
[2022-11-30T14:50:16Z] <Info/Warning/Error>: <log message>
Alguém entende por que o awk está funcionando, ou seja, ele está dividindo o arquivo corretamente, mas o código messageDate=$(date -d "$2" "+%Y.%j.%H.%M.%S")
está de alguma forma recebendo a mensagem de log completa novamente?
Sobre o "comando bash awk" - bash e awk são 2 ferramentas completamente diferentes. Você pode chamar awk do bash, ou pode chamar bash do awk, assim como você pode chamar um programa C ou script perl do bash e vice-versa, mas cada ferramenta tem sua própria linguagem, escopo, etc.
Quando você escreveu:
você está tentando usar a sintaxe bash dentro de um script awk, o que tem tantas chances de funcionar quanto tentar usar a sintaxe bash dentro de um programa C.
Para chamar um utilitário Unix como
date
fromawk
(por meio de um shell intermediário comobash
) e armazenar o resultado em uma variável awk e então imprimir o resultado se a operação for bem-sucedida, como você parece estar tentando fazer em seu script, seria isso usando qualquer awk:Veja http://awk.freeshell.org/AllAboutGetline (ou, se estiver inativo, https://web.archive.org/web/20221109201352/http://awk.freeshell.org/AllAboutGetline ) para mais informações sobre como estou usando
getline
lá.Se você estiver usando o GNU awk, ele tem suas próprias funções de tempo integradas , então você pode fazer:
o que seria ordens de magnitude mais rápido do que ter o awk gerando um shell para chamar
date
uma vez por linha de entrada.Você pode tentar esta solução:
Observe que você não precisará
grep
, poisawk
pode fazer esse trabalho também, imprimir somente essas colunas quando encontrar textoexpression
em uma linha.