272 votes

Commande pour obtenir la n-ième ligne de STDOUT

Y a-t-il une commande bash qui vous permettra d'obtenir la ligne nth de STDOUT?

C'est-à-dire, quelque chose qui prendrait ceci:

$ ls -l
-rw-r--r--@ 1 root  wheel my.txt
-rw-r--r--@ 1 root  wheel files.txt
-rw-r--r--@ 1 root  wheel here.txt

et ferait quelque chose comme

$ ls -l | magic-command 2
-rw-r--r--@ 1 root  wheel files.txt

Je réalise que ce serait une mauvaise pratique lors de l'écriture de scripts destinés à être réutilisés, MAIS en travaillant avec le shell au quotidien, il me serait utile de pouvoir filtrer mon STDOUT de cette manière.

Je réalise aussi que ce serait une commande semi-triviale à écrire (buffer STDOUT, retourner une ligne spécifique), mais je veux savoir s'il y a une commande shell standard pour faire cela qui serait disponible sans que je doive ajouter un script en place.

13 votes

Je viens de voter pour l'utilisation du mot commande-magique

410voto

Jonathan Leffler Points 299946

En utilisant sed, juste pour varier :

ls -l | sed -n 2p

En utilisant cette alternative, qui semble plus efficace car elle arrête la lecture de l'entrée une fois la ligne requise imprimée, peut générer un SIGPIPE dans le processus d'alimentation, ce qui peut à son tour générer un message d'erreur indésirable :

ls -l | sed -n -e '2{p;q}'

J'ai vu cela assez souvent pour que j'utilise généralement le premier (qui est plus facile à taper, de toute façon), même si ls n'est pas une commande qui se plaint lorsqu'elle reçoit un SIGPIPE.

Pour une plage de lignes :

ls -l | sed -n 2,4p

Pour plusieurs plages de lignes :

ls -l | sed -n -e 2,4p -e 20,30p
ls -l | sed -n -e '2,4p;20,30p'

1 votes

Qu'est-ce que p signifie? comme 2p 3p? Dans le sens où je comprends que c'est pour 2/3 ligne, mais quelle est la théorie/compréhension derrière cela?

7 votes

@LeoUfimtsev : la balise p est la commande sed qui affiche les lignes identifiées par la plage de lignes qui la précède. Ainsi, 2,4p signifie imprimer les lignes 2, 3, 4.

6 votes

Et n signifie de NE PAS imprimer toutes les autres lignes

110voto

mob Points 61524
ls -l | head -2 | tail -1

14 votes

+2, mais je suggérerais head -n 2 | tail -n 1 - les versions modernes de head et tail ont tendance à émettre des avertissements autrement.

2 votes

En utilisant deux processus pour filtrer les données est un peu exagéré (mais, compte tenu de la puissance actuelle des machines, elles s'en sortiraient probablement). La généralisation pour gérer une plage n'est pas entièrement simple (pour la plage N..M, vous utilisez head -n M | tail -n M-N+1), et la généralisation pour gérer plusieurs plages n'est pas possible.

3 votes

Head tuyauté dans la queue? horrible. Plusieurs meilleures façons de le faire.

53voto

ChristopheD Points 38217

Alternative à la manière agréable de la tête / queue:

ls -al | awk 'NR==2'

ou

ls -al | sed -n '2p'

1 votes

Le mien awk est meilleur, mais sed est agréable.

0 votes

Pas besoin d'un "if" - voir la réponse du hacker (à l'exception de la partie à propos de trouver chaque fichier sur le système). ;-)

0 votes

Que signifie '2p' ?

23voto

Mark Edgar Points 1335

De sed1line:

# imprimer le numéro de ligne 52
sed -n '52p'                 # méthode 1
sed '52!d'                   # méthode 2
sed '52q;d'                  # méthode 3, efficace sur les grands fichiers

De awk1line:

# imprimer le numéro de ligne 52
awk 'NR==52'
awk 'NR==52 {print;exit}'          # plus efficace sur les grands fichiers

7voto

Dennis Williamson Points 105818

Essayez cette version de sed :

ls -l | sed '2 ! d'

Cela dit "supprimer toutes les lignes qui ne sont pas la deuxième".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X