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.
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
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
Vous pouvez utiliser awk directement.
awk 'NR==1' file.txt
en remplaçant "1" par le numéro de ligne souhaité.
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.
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