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/ seddeberí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
grepsi se conoce el número de líneas que desea opción de contexto se puede utilizar-Apara imprimir líneas según el modeloeso te dará la línea con 2013-07-13 y las siguientes 3 líneas
con
sedusted 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
dpara 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.awksolución:Básicamente imprime cualquier línea desde la que comienza con
2016-07-13la que comienza con2016-07-19fuente
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
starttimeyendtimeen un formato quemktimecomprende (YYYY MM DD hh dd ss). Por lo tanto, ejecuta elawkcomando de esta manera, suponiendo que el script Awk anterior está en un archivo ejecutablefilter-log-dates.awken 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
matchfunció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
awkcomando, 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