Tengo texto de archivo grande (casi 3 GB): es un archivo de registro. Quiero obtener líneas de texto que correspondan a un rango de fechas de este archivo, del 13 de julio al 19 de julio. Mi formato de registro es:
2016-07-12 < ?xml version>
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
2016-07-20 < ?xml version>
sample text sample text
sample text sample text
sample text sample text
2016-07-20 < ?xml version>
sample text sample text
2016-07-20 < ?xml version>
así que después grep
/ sed
debería salir así:
2016-07-13 < ?xml version>
2016-07-18 < ?xml version>
2016-07-18 < ?xml version>
2016-07-19 < ?xml version>
¿Cómo puedo conseguir esto?
command-line
grep
sed
corey
fuente
fuente
Respuestas:
Con
grep
si se conoce el número de líneas que desea opción de contexto se puede utilizar-A
para imprimir líneas según el modeloeso te dará la línea con 2013-07-13 y las siguientes 3 líneas
con
sed
usted puede usar las fechas para delimitar asíque imprimirá todas las líneas desde la primera línea con 2016-07-13 hasta e incluyendo la primera línea con 2016-07-19. Pero eso supone que solo tiene una línea con 2016-07-19 (no imprimirá la siguiente línea). Si hay varias líneas, use la siguiente fecha en su lugar y use
d
para eliminar la salida de ellafuente
Este simple grep one liner será suficiente:
Funciona bien aquí y no hay necesidad de sed :)
Referencias
fuente
^
para que funcione. Usando Mac.awk
solución:Básicamente imprime cualquier línea desde la que comienza con
2016-07-13
la que comienza con2016-07-19
fuente
Todas las demás respuestas actuales se basan en el hecho de que las entradas del archivo de registro se ordenan cronológicamente o en el hecho de que el intervalo de fechas se puede combinar fácilmente con expresiones regulares. Si desea una solución más genérica, necesitamos hacer más programación.
Les presento este script GNU AWK:
Proporciona el tiempo de inicio y finalización a través de las variables
starttime
yendtime
en un formato quemktime
comprende (YYYY MM DD hh dd ss
). Por lo tanto, ejecuta elawk
comando de esta manera, suponiendo que el script Awk anterior está en un archivo ejecutablefilter-log-dates.awk
en el directorio de trabajo actual y el archivo de registro esmylog.txt
:Tenga en cuenta que la hora de finalización es exclusiva , es decir, los registros de registro válidos deben tener una marca de tiempo antes de la hora de finalización.
Si su formato de marca de tiempo es diferente, puede ajustar la expresión regular pasada a la
match
función para adaptarla.fuente
Podrías hacerlo en pasos. Encuentre el número de la primera línea que coincida con su patrón inicial. Encuentra el número de la última línea que coincide con tu patrón final. Luego extraiga la prueba entre estas dos líneas. Esto puede hacerse de la siguiente manera.
Esto podría hacerse todo en un
awk
comando, pero los pasos pueden facilitar su seguimiento. Dentro de awk, la variable NR es el número de línea actual, y dado que no se especificó ninguna acción después del patrón (NR> = 1234 && NR <= 5678), la acción predeterminada es imprimir las líneas que están en ese rango.fuente