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?
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?
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ür FOR
oder 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 NR
den der "Nummerndatensatz" angegeben wird. Dies ist normalerweise die aktuelle Zeile, awk
die verarbeitet wird.
awk
Code für eine solche Aufgabe in der Regel ls -l | awk 'NR==122,NR==129'
.
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 .
sed
Methode vorschlagen , da siesed
viel kleiner ist (und schneller geladen wird) alsawk
.