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.
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 thiscase, 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 .
sed
Methode vorschlagen , da siesed
viel kleiner ist (und schneller geladen wird) alsawk
.Antworten:
Sie haben nicht verstanden, wie es
awk
funktioniert. Das angegebene "Programm" wird immer einmal für jede Zeile (oder "Aufzeichnung" in awk-Sprache) der Eingabe ausgeführt, es besteht keine Notwendigkeit fürFOR
oder ein ähnliches Konstrukt. Benutz einfach:ausführliche Methode
kompaktere Methode
Geben Sie einen Bereich an, für
NR
den der "Nummerndatensatz" angegeben wird. Dies ist normalerweise die aktuelle Zeile,awk
die verarbeitet wird.quelle
awk
Code für eine solche Aufgabe in der Regells -l | awk 'NR==122,NR==129'
.Eine weitere alternative Methode wäre
sed
: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:
Wenn Sie möchten, können Sie auch erweiterte Bedingungen festlegen. Beispielsweise:
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 .
quelle
Eine andere Möglichkeit, dies zu tun (obwohl ich die
awk
Methode bevorzuge ), ist die Verwendung von coreutils:quelle