Was bedeutet der Befehl lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Gelöscht \) $ / {printf “> / proc /% s / fd /% d \ n”, $ 2, $ 4}' bedeuten

9

Ich lese einige Artikel und habe diesen Befehl gesehen:

lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Könnte mir ein Körper helfen, es zu verstehen?

Braiam
quelle
+1 & Favorit, weil es eine interessante Frage ist. :-)
Lorenzo Ancora

Antworten:

7

Dieser Befehl druckt Dateien lsof, die abgeschnitten werden müssen.

(Es werden tatsächlich keine Dateien entfernt oder abgeschnitten ).

lsof gibt eine Liste der geöffneten Dateien (Dateideskriptoren) zurück, die an die awk weitergeleitet werden, die sie wie folgt verarbeitet.

gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Der obige Ausdruck enthält zwei reguläre Ausdrücke, die durch ein Semikolon getrennt sind ;

Betrachten wir den ersten Teil gawk '$4~/txt/{next};

Wenn hier das 4. Feld enthält, txtwird die nächste Textzeile gelesen, die das Skript von Anfang an erneut verarbeitet.

Die nextAnweisung zwingt awk, die Verarbeitung des aktuellen Datensatzes sofort zu beenden und mit dem nächsten Datensatz fortzufahren. Dies bedeutet, dass für den aktuellen Datensatz keine weiteren Regeln ausgeführt werden und der Rest der Aktion der aktuellen Regel nicht ausgeführt wird.

Betrachten wir nun den zweiten Teil des Skripts /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Wenn die Zeile mit dem regulären Ausdruck übereinstimmt /REG.*\(deleted\)$(das $bedeutet, dass (deleted)dies das letzte Wort in der Zeile sein sollte), wird nur gedruckt >/proc/%s/fd/%d\n", $2,$4.

Im Befehl lsof $4ist die Dateideskriptornummer (z. B. 53wdas wMittel , mit dem der Filer zum Schreiben geöffnet wurde) oder der Dateityp abhängig von der Datei. Das %din printfstellt sicher, dass nur die Zahlen gedruckt werden, wobei alle Textzeichen (wie das w) entfernt werden. $2Gibt die Prozess-ID des Prozesses aus, der die Datei verwendet, damit so etwas wie >/proc/3989/fd/53usw. gedruckt wird. Es werden alle Dateien gedruckt, die gelöscht wurden, deren Dateideskriptor jedoch offen bleibt, dh Dateideskriptoren, die sicher abgeschnitten werden können.

Stormvirux
quelle
2

Dieser Befehl schneidet gelöschte Dateien von lsof ab.

Hier werden zuerst geöffnete Dateien aufgelistetlsof

Suchen Sie dann rekursiv nach Zeilen und dann nach einer Zeile {next}, die REG '$4~/txt/{next};/REG.*\(deleted\)$/als vierten Parameter enthält. Dann wird dieser Prozess relativ zu dieser Zeile gelöscht

und drucken Sie dann alle Ergebnisse ohne die Zeilen, die REG enthalten und als gelöscht markiert sind.{printf ">/proc/%s/fd/%d\n", $2,$4}'


quelle
Ich denke, Sie sollten die verschiedenen Teile des Befehls erklären (zumindest, um meine Gegenstimme zu erhalten).
don.joey
Überprüfen Sie mein Update
1
Wann hat eine awk-Anweisung mit Regex und einer Druckanweisung begonnen, den tatsächlichen Inhalt abzuschneiden? Sie müssen diesen Befehl an a übergeben, shum ihn tatsächlich abzuschneiden, und außerdem gibt es dort zwei reguläre Ausdrücke, nicht einen wie in Ihrer Erklärung
Stormvirux