Existe-t-il une commande bash qui vous permettra d'obtenir la nième ligne de STDOUT?
Autrement dit, quelque chose qui prendrait cette
$ 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 faire quelque chose comme
$ ls -l | magic-command 2
-rw-r--r--@ 1 root wheel files.txt
Je me rends compte 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 jour le jour, il serait utile pour moi de pouvoir filtrer mon STDOUT de cette manière.
Je réalise également que ce serait une commande semi-triviale à écrire (tampon STDOUT, retourner une ligne spécifique), mais je veux savoir s'il existe une commande shell standard pour ce faire qui serait disponible sans que je laisse tomber un script en place.
magic-command
Réponses:
Utilisation
sed
, juste pour la variété:L'utilisation de cette alternative, qui semble plus efficace car elle arrête de lire l'entrée lorsque la ligne requise est imprimée, peut générer un SIGPIPE dans le processus d'alimentation, ce qui peut générer à son tour un message d'erreur indésirable:
Je l'ai vu assez souvent pour que j'utilise habituellement le premier (qui est plus facile à taper, de toute façon), mais ce
ls
n'est pas une commande qui se plaint quand il obtient SIGPIPE.Pour une gamme de lignes:
Pour plusieurs gammes de lignes:
la source
p
est lased
déclaration qui imprime les lignes identifiées par la plage de lignes qui la précède. Cela2,4p
signifie donc imprimer les lignes 2, 3, 4.n
signifie ne PAS imprimer toutes les autres lignesla source
head -n 2 | tail -n 1
- les têtes et les queues modernes ont tendance à émettre des avertissements autrement.head -n M | tail -n M-N+1
), et la généralisation pour gérer plusieurs plages n'est pas possible.$ ls -l | awk '{if (NR>=4 && NR<=64) print}'
(peut ajouter plus de conditions plus facilement, plusieurs plages, etc ...)Alternative à la belle façon tête / queue:
ou
la source
'2p'
?2
c'est une variable? Chaque exemple utilise des guillemets simples, mais avec un var, vous avez besoin de guillemets doubles. Pourrions-nous "programmer" awk pour qu'il fonctionne également avec des guillemets simples lors de l'utilisation de var Exempleline =1; ls | awk 'NR==$line'
. Je sais que celabash
utilise des guillemets doubles avec vars.De sed1line :
De awk1line :
la source
Par souci d'exhaustivité ;-)
code plus court
durée de vie plus courte
la source
ls
- la question initiale concernait quelqu'unSTDOUT
, donc j'ai pensé qu'il valait mieux l'avoir plus grand.{ print $0 }
, donc `awk 'NR == 3' est un moyen plus court d'écrire la même chose.Essayez cette
sed
version:Il dit "supprimez toutes les lignes qui ne sont pas la deuxième".
la source
Vous pouvez utiliser awk:
Mettre à jour
Le code ci-dessus n'obtiendra pas ce que nous voulons en raison d'une erreur au coup par coup: la première ligne de la commande ls -l est la ligne totale . Pour cela, le code révisé suivant fonctionnera:
la source
Perl est-il facilement accessible pour vous?
Remplacez évidemment le numéro de votre choix par 7.
la source
$ awk 'NR % 7' filename
pour imprimer chaque 7ème ligne de fichier.Une autre affiche suggérée
mais si vous dirigez la tête dans la queue, il semble que tout jusqu'à la ligne N soit traité deux fois.
Passe la queue dans la tête
serait plus efficace?
la source
Oui, le moyen le plus efficace (comme l'a déjà souligné Jonathan Leffler) est d'utiliser sed avec print & quit:
la source
Hmm
sed n'a pas fonctionné dans mon cas. Je propose:
la source
Pour plus d'exhaustivité ..
Jetez les lignes jusqu'à ce que vous arriviez à la seconde, puis imprimez la première ligne après cela. Ainsi, il imprime la 3ème ligne.
Si c'est juste la deuxième ligne ..
Mettez autant de lectures que nécessaire.
la source
J'ai ajouté ceci dans mon .bash_profile
Et ça marche
la source