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?
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?
Réponses:
Vous n'avez pas compris comment ça awk
marche. 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 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 awk
traitement.
awk
code typique pour une telle tâche est généralement ls -l | awk 'NR==122,NR==129'
.
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 .
sed
méthode, car ellesed
est beaucoup plus petite (et se charge plus rapidement) queawk
.