2011-04-15 16 views
45

Tengo pocos archivos de registro de alrededor de 100MB cada uno. Personalmente, me resulta engorroso tratar con archivos tan grandes. Sé que las líneas de registro que me interesan son solo entre 200 y 400 líneas más o menos.Cómo recortar (cortar) archivos de texto basados ​​en números de línea iniciales y finales en cygwin?

¿Cuál sería una buena manera de extraer líneas de registro relavantes de estos archivos, es decir, solo quiero canalizar el rango de números de línea a otro archivo?

Por ejemplo, las entradas son:

filename: MyHugeLogFile.log 
Starting line number: 38438 
Ending line number: 39276 

¿Hay un comando que se puede ejecutar en cygwin a cabo sólo cat ese rango en ese archivo? Sé que si de alguna manera puedo mostrar ese rango en stdout, también puedo conectarme a un archivo de salida.

Nota: Agregar la etiqueta Linux para obtener más visibilidad, pero necesito una solución que funcione en cygwin. (Por lo general, los comandos de Linux funcionan en cygwin).

+3

archivos de registro 100 Mb no son enormes ;-) – Johnsyweb

+0

Claro, pero si usted tiene que estudiar las partes de ellos en un editor como notepad ++, entonces aparecerá bastante grande :) es un – bits

Respuesta

91

Suena como un trabajo para sed:

sed -n '8,12p' yourfile 

... enviará líneas 8 a 12 de yourfile a la salida estándar.

Si desea anteponer el número de línea, es posible que desee utilizar cat -n primera:

cat -n yourfile | sed -n '8,12p' 
+0

@bits: Feliz de ayudar. Agregué la sección 'cat' de mi respuesta mientras escribías eso. Quizás eso también sea útil. – Johnsyweb

+2

Creo que la primera solución que no incluye 'cat' es la más adecuada para mí. Simple y conciso. – bits

4

¿Qué tal esto:

$ seq 1 100000 | tail -n +10000 | head -n 10 
10000 
10001 
10002 
10003 
10004 
10005 
10006 
10007 
10008 
10009 

Utiliza tail a la salida de la línea número 10.000 en adelante y luego head a mantener solamente 10 líneas.

El mismo (casi) resultado con sed:

$ seq 1 100000 | sed -n '10000,10010p' 
10000 
10001 
10002 
10003 
10004 
10005 
10006 
10007 
10008 
10009 
10010 

Éste tiene la ventaja de que permite a la entrada de la línea de rango directamente.

+0

posible solución, pero eso requiere que calcule '39276-38438 = 838'. Porque tendré que usar '838' como entrada en la cabeza. Estoy buscando una solución en la que los parámetros de entrada sean estrictamente los números de línea iniciales y finales, es decir, '38438' y' 39276'. – bits

10

Puede utilizar wc -l de averiguar el # total de líneas.

Puede combinar head y tail para obtener el rango que desea. Asumamos que el registro es de 40.000 líneas, desea que los últimos 1562 líneas, a continuación, de los que desea que el primer 838. Por lo tanto:

tail -1562 MyHugeLogFile.log | head -838 | .... 

O es probable que haya una manera más fácil usando sed o awk.

4

Vi este hilo cuando estaba tratando de dividir un archivo en archivos con 100 000 líneas.Una solución mejor que la sed de esto es:

split -l 100000 database.sql database- 

Dará tipos de archivos:

database-aaa 
database-aab 
database-aac 
... 
1

Si usted está interesado únicamente en los últimas líneas X, puede utilizar el comando "cola" Me gusta esto.

$ tail -n XXXXX yourlogfile.log >> mycroppedfile.txt 

Esto ahorrará las últimas líneas XXXXX de su archivo de registro a un nuevo archivo llamado "mycroppedfile.txt"

4

Y si simplemente desea cortar parte de un archivo - decir de la línea 26 a 142 - y la entrada a un nuevofichero: cat file-to-cut.txt | sed -n '26,142p' >> new-file.txt

+0

Lo que dices es lo mismo que la respuesta aceptada: http://stackoverflow.com/a/5683408 – bits

+0

Después de hacer esto, no estoy seguro si 'cortar' es la palabra correcta dado que en mi sistema GNU/Linux el comando hace una 'copia' en lugar de lo que normalmente se le atribuiría a un corte. –

Cuestiones relacionadas