Si uso cat -n text.txt
para numerar automáticamente las líneas, ¿cómo puedo usar el comando para mostrar solo ciertas líneas numeradas?
tail
+ head
también puede hacer esto, como puedeawk
Si uso cat -n text.txt
para numerar automáticamente las líneas, ¿cómo puedo usar el comando para mostrar solo ciertas líneas numeradas?
tail
+ head
también puede hacer esto, como puedeawk
Respuestas:
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
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 -n
ni siquiera es necesario:
sed '9,12!d' text.txt
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.
cat
embargo, ninguno de los ejemplos necesita
cat
no puede hacer lo que quiere el OP
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 -n
y 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
, $1
es 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 -n
para 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