Con el comando de Linux “ cat ”, ¿cómo puedo mostrar solo ciertas líneas por número
On febrero 15, 2021 by admin Si utilizo cat -n text.txt
para numerar automáticamente las líneas, ¿cómo uso el comando para mostrar solo ciertas líneas numeradas?
Comentarios
Respuesta
Use 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 & 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 un rango con otra línea específica (5 – 8 & 10)
$ sed -n -e 5,8p -e 10p file Line 5 Line 6 Line 7 Line 8 Line 10
Respuesta
Una forma de hacerlo es usando 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
Responder
Usted puede usar awk directamente.
awk "NR==1" file.txt
reemplazando «1» con el número de línea deseado.
Comentarios
Respuesta
Dependiendo de los objetivos, me gusta head o grep
cat /var/log/syslog -n | head -n 50 | tail -n 10
devolverá las líneas 41 a 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 tiene que usar la cuenta para rellenar los números de línea (observe el espacio)
Ambos son bastante útiles para analizar archivos de registro.
Comentarios
- Ninguno de los ejemplos necesita
cat
aunque - bueno, sí .. .pero …. pero … ….. Hay mejores formas. Sin embargo, la pregunta era sobre el uso de cat, así que la usé.
-
cat
no puede ' hacer lo que el OP quiere
Responder
Como otros le han mostrado, no es necesario utilizar cat -n
. Otros programas lo harán por ti. Sin embargo, si realmente necesita analizar la salida de cat -n
y mostrar solo líneas específicas (por ejemplo, 4-8, 12 y 42), puede hacer:
$ 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 se 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:
$ 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
Comentarios
- ¿No pudo ' t usó
NR
en lugar de$1
? - @SolomonUcko seguro, pero como estaba demostrando cómo hacer esto usando
cat -n
específicamente, pensé que usaría la salida quecat -n
proporciona .
Responder
Puede usar sed para mostrar solo un número y l Oop esto con un bucle for:
for line in 1 3 7 11; do sed -n ${line}p text.txt; done
tail
+head
también puede hacer esto, al igual queawk