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 campos seja definido para dois pontos ou espaço seguido por um ponto e vírgula. Essa combinação nunca ocorre no arquivo de entrada. -
No código original, a atribuição
d='$date_';
resultou emd
com o 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 shell para o awk usando a opção
-v
. Tanto o shell quanto o awk podem exigir uma cotação adequada e a opção-v
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. Adicionando
+0
no código, asseguramos que o awk está fazendo comparações numéricas.