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

59

Si je cat -n text.txtnumérote automatiquement les lignes, comment puis-je utiliser la commande pour afficher uniquement certaines lignes numérotées.

Geckono1
la source
1
Que voulez-vous dire par "afficher uniquement certaines lignes numérotées", pouvez-vous indiquer le résultat attendu?
Tachomi
1
Il y aura probablement un million de façons de le faire. tail+ headpeut également le faire, comme le peutawk
Bratchley

Réponses:

120

Utilisation 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 une plage avec une autre ligne spécifique (5 - 8 & 10)

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

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 à supprimer.

Ou pour supprimer tout sauf 11:

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

Les gammes sont également possibles:

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

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

sed '9,12!d' text.txt
phk
la source
9

Vous pouvez utiliser awk directement.

awk 'NR==1' file.txt

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

KUBball3
la source
1
C’est à un million de kilomètres la meilleure réponse ici et mérite beaucoup plus d’amour qu’il n’en a.
Wren
8

En fonction des objectifs, j'aime bien 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

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

Les deux sont assez pratiques pour analyser les fichiers journaux.

coteyr
la source
Aucun exemple n'a catcependant besoin
roaima
1
eh bien oui ... mais ... mais ... ..... Il y a de meilleures façons. La question portait sur l'utilisation de chat, alors je l'ai utilisée.
coteyr
catne peut pas faire ce que l'OP veut
roaima
2

Comme d’autres l’ont montré, il n’est pas nécessaire d’utiliser cat -n. D'autres programmes le feront pour vous. Si, toutefois, vous avez vraiment besoin d'analyser le résultat cat -net de ne montrer que des lignes spécifiques (par exemple, 4-8, 12 et 42), vous pouvez effectuer les opérations suivantes:

$ 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, $1le premier champ, de sorte que 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 -npour obtenir les lignes d'origine du fichier, vous pouvez procéder comme suit:

$ 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
la source