Antworten:
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.
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}'
shum ihn tatsächlich abzuschneiden, und außerdem gibt es dort zwei reguläre Ausdrücke, nicht einen wie in Ihrer Erklärung