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