
Estou tentando extrair o intervalo de tempo de um arquivo de log passando variáveis de shell no arquivo awk
. É assim que meu arquivo de log é.
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 13:58:59.290 2.2.2.2 etc..
2014-11-24 14:58:59.290 3.3.3.3 etc ..
2014-11-24 12:58:59.290 4.4.4.4 etc..
2014-11-24 15:58:59.290 4.4.4.4 etc..
Suponha que eu queira extrair o intervalo de tempo entre 12 e 13 horas. Aqui está o script bash que escrevi.
stime=12
etime=13
date_=2014-11-24
awk 'BEGIN {
a='$stime';b='$etime';d='$date_'; FS="[: ]"
}
{
if ( $1 == d && $2 >= a && $2 < b )
print $1 $2 $3
}' logfile.txt
Minha saída deve ficar assim.
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 12:58:59.290 4.4.4.4 etc..
Não vejo nenhuma saída nem erros. Eu não sei o que está acontecendo de errado. Qualquer ajuda com isso seria apreciada. Obrigado
Responder1
stime=12
etime=13
date=2014-11-24
awk -v a="$stime" -v b="$etime" -v d="$date" -F "[: ]+" '
{
if ( $1 == d && $2+0 >= a && $2+0 < b )
print $1,$2,$3
}' logfile.txt
Isso produz a saída:
2014-11-24 12 58
2014-11-24 12 58
Notas:
FS="[: ];"
faz com que o separador de campo seja definido como dois pontos ou espaço seguido por ponto e vírgula. Essa combinação nunca ocorre no arquivo de entrada.No código original, a atribuição
d='$date_';
resultoud
no valor de1979
. Isso porque, quando introduzida no código awk, a expressão2014-11-24
é interpretada como uma expressão numérica que requer subtração.É uma boa prática transferir variáveis do shell para o awk usando a
-v
opção. Tanto o shell quanto o awk podem exigir cotações adequadas e a-v
opção nos permite lidar com esses problemas de cotação um de cada vez.O awk é capaz de fazer comparações numéricas ou alfabéticas dependendo do contexto. Ao adicionar
+0
o código, garantimos que o awk está fazendo uma comparação numérica.