Wie läuft man awk für einige Zeilen?

17

Ich möchte mit ein paar Zeilen extrahieren awk. Ist es möglich die folgende Aufgabe zu erledigen:

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

Wie kann ich die Details der Zeilennummern 122 bis 129 anzeigen?

cooldharma06
quelle
Wenn Sie dies in einer Schleife tun würden, würde ich die sedMethode vorschlagen , da sie sedviel kleiner ist (und schneller geladen wird) als awk.
Zrajm

Antworten:

36

Sie haben nicht verstanden, wie es awkfunktioniert. Das angegebene "Programm" wird immer einmal für jede Zeile (oder "Aufzeichnung" in awk-Sprache) der Eingabe ausgeführt, es besteht keine Notwendigkeit für FORoder ein ähnliches Konstrukt. Benutz einfach:

ausführliche Methode

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

kompaktere Methode

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

Geben Sie einen Bereich an, für NRden der "Nummerndatensatz" angegeben wird. Dies ist normalerweise die aktuelle Zeile, awkdie verarbeitet wird.

zrajm
quelle
6
Eigentlich ist der typische awkCode für eine solche Aufgabe in der Regel ls -l | awk 'NR==122,NR==129'.
Manatwork
Was ist der Befehl zum
Abrufen der
8

Eine weitere alternative Methode wäre sed:

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

Wenn es jedoch wichtig ist, awk zu verwenden, wie Ihre Frage nahelegt, lesen Sie den Kommentar von manatwork zur Antwort von Zrajm. In der Dokumentation von awk heißt es:

   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.

Wenn Sie möchten, können Sie auch erweiterte Bedingungen festlegen. Beispielsweise:

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

Dies würde die Ausgabe in Zeile 122 beginnen und fortgesetzt, bis eine Zeile das Wort "foobar" enthält.

Wenn Sie uns den tatsächlichen Anwendungsfall mitteilen , können wir möglicherweise mit Antworten helfen, die eine bessere Lösung bieten. Ich mache mir Sorgen, dass dies wie ein XY-Problem klingt .

ghoti
quelle
2

Eine andere Möglichkeit, dies zu tun (obwohl ich die awkMethode bevorzuge ), ist die Verwendung von coreutils:

ls -l | tail -n +122 | head -n 8
terdon
quelle