Comment exécuter awk pour un certain nombre de lignes.?

18

Je veux extraire quelques lignes avec awk. Est-il possible de faire la tâche suivante:

ls -l | awk 'BEGIN FOR(i=122;i<=129;i++) FNR==i'

Comment afficher les détails des numéros de ligne 122 à 129?

cooldharma06
la source
Si vous deviez le faire en boucle, je suggérerais la sedméthode, car elle sedest beaucoup plus petite (et se charge plus rapidement) que awk.
zrajm

Réponses:

36

Vous n'avez pas compris comment ça awkmarche. Le "programme" spécifié est toujours exécuté une fois pour chaque ligne (ou "enregistrement" en langage awk) d'entrée, il n'y a pas besoin de FORou de construction similaire. Utilisez simplement:

méthode verbeuse

ls -l | awk 'NR>=122 && NR<=129 { print }'

méthode plus compacte

ls -l | awk 'NR==122,NR==129'

Celui-ci donne une plage pour NR, qui est le "numéro d'enregistrement", généralement c'est la ligne en cours de awktraitement.

zrajm
la source
6
En fait, le awkcode typique pour une telle tâche est généralement ls -l | awk 'NR==122,NR==129'.
manatwork
quelle est la commande pour obtenir les 100 dernières lignes du fichier en utilisant awk
Shihabudheen KM
8

Une autre méthode alternative serait d'utiliser sed:

ls -l | sed -ne '122,129p'

Mais si, comme votre question le suggère, il est important d'utiliser awk pour cela, allez avec le commentaire de manatwork sur la réponse de Zrajm. Comme l'indique la documentation d'awk:

   A  pattern  may  consist  of two patterns separated by a comma; in this
   case, the action is performed for all lines from an occurrence  of  the
   first pattern though an occurrence of the second.

Donc, si vous le souhaitez, vous pouvez également créer des conditions plus avancées. Par exemple:

ls -l | awk 'NR==122,/foobar/'

Cela commencerait la sortie à la ligne 122 et continuerait jusqu'à ce qu'une ligne contienne le mot "foobar".

Si vous nous dites le cas d'utilisation réel , nous pourrons peut-être vous aider avec des réponses qui fourniront une meilleure solution. Je crains que cela ne ressemble à un problème XY .

ghoti
la source
2

Une autre façon de faire cela (bien que je préfère la awkméthode) en utilisant coreutils:

ls -l | tail -n +122 | head -n 8
terdon
la source