web-dev-qa-db-fra.com

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

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?

22
cooldharma06

Vous n'avez pas compris comment awk fonctionne. 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 FOR ou d'une construction similaire. Utilisez simplement:

méthode détaillée

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

méthode plus compacte

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

On donne une plage pour NR, qui est le "Number Record", généralement c'est la ligne actuelle que awk est en train de traiter.

40
zrajm

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 indiquez 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 .

9
ghoti

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

ls -l | tail -n +122 | head -n 8
3
terdon
 awk  'NR == 122,NR == 129{print $0}'  file

Ici, nous pouvons extraire les lignes de 122 à 129 du fichier.

$0 est utilisé pour imprimer toutes les données du fichier entre 122 et 129 lignes.

0
Ramya