84 votos

Cómo mostrar ciertas líneas de un archivo de texto en Linux?

Supongo que todo el mundo conoce la utilidad de Linux cmd utilidades de la línea de la cabeza y la cola. La cabeza le permite imprimir la primera X líneas de un archivo, la cola se hace lo mismo pero se imprime al final del archivo. ¿Qué es un buen comando para imprimir el medio de un archivo? algo así como medio --inicio 10000000 --count 20 (imprimir el 10.000.000 de th hasta th 10,000,010 th líneas).

Estoy buscando algo que se tendrá que tratar con archivos de gran tamaño de manera eficiente. Traté de tail-n 10000000 | de la cabeza 10 y es terriblemente lento.

Gracias, Booz

108voto

jason saldo Puntos 5036
sed -n '10000000,10000020p' filename

Usted podría ser capaz de velocidad que hasta un poco como esta:

sed -n '10000000,10000020p; 10000021q' filename

Por cierto, el comando

tail -n 10000000 filename | head 10

se inicia en la diez millonésima parte de la línea desde el final del archivo, mientras que su "medio" de comandos que parecen comenzar en la diez millonésima parte desde el principio que sería equivalente a:

head -n 10000010 filename | tail 10

El problema es que para sin clasificar archivos con la variable longitud de las líneas de cualquier proceso que se va a tener que ir a través del archivo de conteo de saltos de línea. No hay forma de acceso directo.

Sin embargo, si el archivo está ordenado (un archivo de registro con la hora, por ejemplo) o se ha fijado la longitud de las líneas, entonces usted puede buscar en el archivo basado en una posición de byte. En el ejemplo de archivo de registro, usted puede hacer una búsqueda binaria para una amplia gama de veces, ya que mi secuencia de comandos de Python aquí*. En el caso de la longitud fija de registro de archivo, es muy fácil. Simplemente busque linelength * linecount caracteres en el archivo.

* Sigo sentido a publicar otra actualización para que la secuencia de comandos. Tal vez voy a conseguir alrededor de él uno de estos días.

27voto

Dox Puntos 161

He encontrado el siguiente uso de la sed

sed -n '10000000,+20p'  filename

Espero que sea útil a alguien!

4voto

Dennis Puntos 21

Esta es mi primera vez posteando! De todos modos, esto es fácil. Digamos que usted desea tirar de la línea de 8872 de su archivo llamado file.txt. Aquí está cómo hacerlo:

cat-n file.txt | grep '^ *8872'

Ahora la cuestión es saber de 20 líneas después de esto. Para lograr esto es hacer

cat-n file.txt | grep-20 '^ *8872'

Para las líneas alrededor de o antes de ver la-B y-C banderas en el grep manual.

1voto

Charles Stewart Puntos 500

Dennis' sed de respuesta es el camino a seguir. Pero usando un poco la cabeza y la cola, en bash:

medio () { head-n $[ $1 + $2 ] | tail-n $2; }

Esto escanea el primer $1+$2 líneas dos veces, por lo que es mucho peor que la de Dennis respuesta. Pero usted no tiene que recordar todos aquellos sed cartas a usarlo....

0voto

shardan Puntos 181

Un rubí oneliner versión.

ruby -pe 'next unless $. > 10000000 && $. < 10000020' < filename.txt

Puede ser útil para alguien. Las soluciones con 'sed' proporcionado por Dennis y Dox es muy agradable, incluso porque parece más rápido.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: