
Estoy intentando extraer el rango de tiempo de un archivo de registro pasando variables de shell en awk
. Así es mi archivo de registro.
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..
Supongamos que quiero extraer un rango de tiempo entre 12 y 13 horas. Aquí está el script bash que he escrito.
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
Mi salida debería verse así.
2014-11-24 12:58:59.290 1.1.1.1 etc..
2014-11-24 12:58:59.290 4.4.4.4 etc..
No veo ningún resultado ni ningún error. No sé qué está pasando. Se agradecería cualquier ayuda con esto. Gracias
Respuesta1
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
Esto produce la salida:
2014-11-24 12 58
2014-11-24 12 58
Notas:
FS="[: ];"
hace que el separador de campo se establezca en dos puntos o espacio seguido de un punto y coma. Esa combinación nunca ocurre en el archivo de entrada.En el código original, la asignación
d='$date_';
tenía como resultadod
el valor de1979
. Esto se debe a que, cuando se introduce en el código awk, la expresión2014-11-24
se interpreta como una expresión numérica que requiere resta.Es una buena práctica transferir variables de shell a awk usando la
-v
opción. Tanto el shell como el awk pueden requerir comillas adecuadas y la-v
opción nos permite abordar estos problemas de comillas uno a la vez.awk es capaz de realizar comparaciones numéricas o alfabéticas según el contexto. Al agregar
+0
el código, nos aseguramos de que awk esté realizando una comparación numérica.