Con el comando "cat" de Linux, ¿cómo muestro solo ciertas líneas por número?

59

Si uso cat -n text.txtpara numerar automáticamente las líneas, ¿cómo puedo usar el comando para mostrar solo ciertas líneas numeradas?

Geckono1
fuente
1
¿Qué quiere decir con "mostrar solo ciertas líneas numeradas", puede poner una salida esperada?
tachomi
1
Probablemente habrá un millón de formas de hacer esto. tail+ headtambién puede hacer esto, como puedeawk
Bratchley

Respuestas:

120

Utilizar sed

Uso

$ cat file
Line 1
Line 2
Line 3
Line 4
Line 5
Line 6
Line 7
Line 8
Line 9
Line 10

Para imprimir una línea (5)

$ sed -n 5p file
Line 5

Para imprimir varias líneas (5 y 8)

$ sed -n -e 5p -e 8p file
Line 5
Line 8

Para imprimir un rango específico (5 - 8)

$ sed -n 5,8p file
Line 5
Line 6
Line 7
Line 8

Para imprimir rango con otra línea específica (5 - 8 y 10)

$ sed -n -e 5,8p -e 10p file
Line 5
Line 6
Line 7
Line 8
Line 10
tachomi
fuente
27

Una forma de hacerlo es mediante el uso de sed:

cat -n text.txt | sed '11d'

donde 11 es el número de la línea que desea eliminar.

O para eliminar todos menos 11:

cat -n text.txt | sed '11!d'

Los rangos también son posibles:

cat -n text.txt | sed '9,12!d'

Y cat -nni siquiera es necesario:

sed '9,12!d' text.txt
phk
fuente
9

Puedes usar awk directamente.

awk 'NR==1' file.txt

reemplazando '1' con el número de línea deseado.

KUBball3
fuente
1
Esta es por un millón de millas la mejor respuesta aquí y merece mucho más amor del que tiene.
Wren
8

Dependiendo de los objetivos me gusta la cabeza o grep

cat /var/log/syslog -n | head -n 50 | tail -n 10

devolverá las líneas 41 a la 50.

o

cat /var/log/syslog -n | grep " 50" -b10 -a10

mostrará las líneas 40 a 60. El problema con el método grep es que debe usar la cuenta para rellenar los números de línea (observe el espacio)

Ambos son bastante útiles para analizar archivos de registro.

coteyr
fuente
Sin catembargo, ninguno de los ejemplos necesita
roaima
1
bueno sí ... pero ... pero ... ..... Hay mejores formas. Sin embargo, la pregunta se refería al uso de cat, así que lo usé.
coteyr
catno puede hacer lo que quiere el OP
roaima
2

Como otros te han mostrado, no hay necesidad de usar cat -n. Otros programas lo harán por usted. Sin embargo, si realmente necesita analizar la salida cat -ny mostrar solo líneas específicas (por ejemplo, 4-8, 12 y 42), puede hacer lo siguiente:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42'
 4  Line 4
 5  Line 5
 6  Line 6
 7  Line 7
 8  Line 8
12  Line 12
42  Line 42

En awk, $1es el primer campo, por lo que este comando imprime todas las líneas cuyos primeros campos son i) entre 4 y 8 (inclusive) o ii) 12 o iii) 42.

Si también desea eliminar el campo agregado por cat -npara obtener las líneas originales del archivo, puede hacer lo siguiente:

$ cat -n file | awk '$1>=4 && $1<=8 || $1==12 || $1==42{sub(/^\s*[0-9]+\s*/,""); print}'
Line 4
Line 5
Line 6
Line 7
Line 8
Line 12
Line 42
terdon
fuente