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?
command-line
Braiam
quelle
quelle
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,
txt
wird die nächste Textzeile gelesen, die das Skript von Anfang an erneut verarbeitet.Die
next
Anweisung 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
$4
ist die Dateideskriptornummer (z. B.53w
dasw
Mittel , mit dem der Filer zum Schreiben geöffnet wurde) oder der Dateityp abhängig von der Datei. Das%d
inprintf
stellt sicher, dass nur die Zahlen gedruckt werden, wobei alle Textzeichen (wie dasw
) entfernt werden.$2
Gibt die Prozess-ID des Prozesses aus, der die Datei verwendet, damit so etwas wie>/proc/3989/fd/53
usw. gedruckt wird. Es werden alle Dateien gedruckt, die gelöscht wurden, deren Dateideskriptor jedoch offen bleibt, dh Dateideskriptoren, die sicher abgeschnitten werden können.quelle
Dieser Befehl schneidet gelöschte Dateien von lsof ab.
Hier werden zuerst geöffnete Dateien aufgelistet
lsof
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öschtund 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
sh
um ihn tatsächlich abzuschneiden, und außerdem gibt es dort zwei reguläre Ausdrücke, nicht einen wie in Ihrer Erklärung