web-dev-qa-db-fra.com

Avec la commande Linux "cat", comment afficher uniquement certaines lignes par numéro

Si j'utilise cat -n text.txt pour numéroter automatiquement les lignes, comment puis-je utiliser la commande pour afficher uniquement certaines lignes numérotées.

77
Geckono1

Utilisez sed

Usage

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

Pour imprimer une ligne (5)

$ sed -n 5p file
Line 5

Pour imprimer plusieurs lignes (5 et 8)

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

Pour imprimer une plage spécifique (5 - 8)

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

Pour imprimer la plage avec une autre ligne spécifique (5 - 8 et 10)

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

Une façon de le faire est d'utiliser sed:

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

où 11 est le numéro de la ligne que vous souhaitez supprimer.

Ou pour supprimer tout sauf 11:

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

Des gammes sont également possibles:

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

Et cat -n n'est même pas nécessaire:

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

Vous pouvez utiliser awk directement.

awk 'NR==1' file.txt

en remplaçant "1" par le numéro de ligne souhaité.

12
KUBball3

Selon les objectifs que j'aime la tête ou le grep

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

retournera les lignes 41 à 50.

ou

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

affichera les lignes 40 à 60. Le problème avec la méthode grep est que vous devez utiliser le compte pour le remplissage des numéros de ligne (notez l'espace)

Les deux sont très pratiques pour analyser les fichiers journaux.

9
coteyr

Comme d'autres vous l'ont montré, il n'est pas nécessaire d'utiliser cat -n. D'autres programmes le feront pour vous. Si, cependant, vous avez vraiment besoin d'analyser la sortie de cat -n et n'afficher que des lignes spécifiques (par exemple, 4-8, 12 et 42), vous pouvez faire:

$ 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

Dans awk, $1 est le premier champ, donc cette commande imprime toutes les lignes dont les premiers champs sont i) entre 4 et 8 (inclus) ou ii) 12 ou iii) 42.

Si vous souhaitez également supprimer le champ ajouté par cat -n pour obtenir les lignes d'origine du fichier, vous pouvez faire:

$ 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
2
terdon