2011-11-17 23 views
26

Tengo un volcado sql con 300mb que me da un error en una línea específica.Línea específica de salida archivo de texto enorme

Pero esa línea está en el medio del archivo. ¿Cuál es el mejor enfoque?

head -n middleLine dump.sql > output?

¿O puedo producir solo la línea que necesito?

+0

qué necesita lo que hay después de esta línea tan bien o sólo lo que está antes? –

Respuesta

33

Se podría utilizar para imprimir sed -n -e 123456p your.dump línea 123456

+0

¡genial! gracias. de hecho uso 'sed -n 123,130p my.dump' para el rango de línea de salida! – balsagoth

+2

Tal vez sea solo yo, pero me parece un mal estilo omitir el '-e'. También estoy citando regularmente el comando sed después de '-e' ya que a menudo contiene varios caracteres extraños :-) ... Lo escribiría' sed -n -e '123,130 p' my.dump'. –

3

Puede usar sed:

sed -n "x p" dump.sql 

donde x es el número de línea.

-4

Si conoces una frase en esa línea me gustaría utilizar grep. Si la frase es "textoError" uso:

$ cat dump.sql | grep "errortext" 
+0

esto no es lo que pido. Esto dará como resultado cada "errortexto" en el archivo, no la línea que necesito salida. – balsagoth

+0

Más de cat | grep es inútil mientras grep puede manejar archivos también. Consulte http://partmaps.org/era/unix/award.html –

22

Si el archivo es largo, considere el uso de

sed -n 'X{p;q}' file 

Donde X es el número de línea. Dejará de leer el archivo después de llegar a esa línea.

+4

+1 para salir después de encontrar la línea. –

+4

En algunos sistemas, como osx, necesita un punto y coma adicional: 'sed -n 'X {p; q;}' file' – LopSae

2

Esto podría funcionar para usted:

sed 'X!d;q' file 

donde X es el número de línea.

4

Si sed es demasiado lento para su gusto puede usar también

cat $THE_FILE | head -n $DESIRED_LINE | tail -n 1 
+1

Si ejecuto algo así como:" started = 'date +% s% 3N'; for i en {1..500}; haz eco de "$ longlist" | sed -n 10p; hecho; stoped = 'date +% s% 3N'; echo" scale = 3; ($ stoped - $ started)/1000 "| bc" y compare con el mismo pero con head -n 10 | tail -n 1, sed es más rápido en mi sistema. – desgua

3

Esto también se puede hacer con Perl:

perl -wnl -e '$. == 4444444 and print and exit;' 

4444444 es el número de línea que desea imprimir.

Tenga en cuenta que el archivo se debe cerrar una vez que se imprime la línea para que no siga leyéndola.

2

También puede intentar awk como:

awk 'NR==YOUR_LINE_NO{print}' file_name 
Cuestiones relacionadas