
Hay un archivo que tiene entradas con el primer y segundo campo como fecha y hora de la siguiente manera: 2015/10/14 00:33:37
.
El archivo tiene más de 100.000 líneas y se actualiza constantemente. Las entradas en el archivo deben seleccionarse desde el lunes a las 00:00:00 hasta el domingo a las 23:59:59.
2015/10/11 23:55:37 abc1 def1 2015/10/11 23:55:39 abc2 def2 2015/10/11 23:56:19 abc3 def3 2015/10/11 23:56:46 abc4 def4 2015/10/11 23:57:46 abc5 def5 2015/10/12 0:04:25 abc6 def6 2015/10/12 0:04:44 abc7 def7 2015/10/12 0:04:44 abc8 def8 2015/10/12 0:04:44 abc9 def9 2015/10/12 0:04:44 abc10 def10 2015/10/12 0:04:44 abc11 def11 2015/10/12 0:04:44 abc12 def12 2015/10/12 0:04:44 abc13 def13 2015/10/12 0:04:44 abc14 def14 2015/10/12 0:04:44 abc15 def15 2015/10/12 0:04:48 abc16 def16 2015/10/12 0:04:48 abc17 def17 2015/10/12 0:04:48 abc18 def18 2015/10/12 0:04:48 abc19 def19 2015/10/12 0:04:49 abc20 def20 2015/10/12 0:04:49 abc21 def21 2015/10/12 0:08:36 abc22 def22 2015/10/12 0:08:36 abc23 def23 2015/10/12 0:08:36 abc24 def24 2015/10/12 0:08:36 abc25 def25 2015/10/12 0:08:36 abc26 def26 2015/10/12 0:08:36 abc27 def27 2015/10/12 0:08:36 abc28 def28 2015/10/12 0:08:37 abc29 def29 2015/10/12 0:08:37 abc30 def30
Respuesta1
Este fragmento de script de shell crea una expresión regular extendida (con /
caracteres con caracteres de escape adecuados) que contiene todos los días desde el último lunes hasta el domingo siguiente, en YYYY/MM/DD
formato. Luego lo usa para grep
buscar en el archivo de registro.
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y\\/%m\\/%d'
done | xargs |
sed -e 's/ /|/g'
)
REGEX="^($DAYS) "
grep -E "$REGEX" logfile.txt
Si prefiere utilizar expresiones regulares básicas, cambie las últimas líneas a:
REGEX="^\($DAYS\) "
REGEX=$(printf "%s" "$REGEX" | sed -e 's/\([|]\)/\\\1/g')
grep "$REGEX" logfile.txt
Otra opción es usar grep
las opciones -F
(cadena fija) y -f
(archivo) con la capacidad de sustitución de procesos del shell <( ... )
, como esta:
DAYS=$(for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done )
grep -F -f <(echo "$DAYS") logfile.txt
o incluso
grep -F -f <( for D in {0..6} ; do
date -d "last monday + $D days" +'%Y/%m/%d'
done ) logfile.txt
NOTA: estas dos últimas versiones coincidirán en una fecha en ese formato en cualquier lugar de la línea, no solo al principio de la línea. Con la muestra que has proporcionado, es probable que esto no sea un problema.