Co oznacza komenda lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Usunięty \) $ / {printf „> / proc /% s / fd /% d \ n”, 2 $, 4 $} oznaczać


9

Czytam kilka artykułów i widziałem to polecenie:

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

Czy jakieś ciało może mi pomóc to zrozumieć


+1 i ulubione, ponieważ to interesujące pytanie. :-)
Lorenzo Ancora

Odpowiedzi:


7

To polecenie wydrukuje pliki, lsofktóre wymagają obcięcia.

(W rzeczywistości nie usuwa ani nie obcina żadnych plików).

lsof zwróci listę otwartych plików (deskryptorów plików), które są przesyłane do awk, który przetwarza je w następujący sposób.

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

Powyższe wyrażenie zawiera dwa wyrażenia regularne oddzielone średnikiem ;

rozważmy pierwszą część gawk '$4~/txt/{next};

Tutaj, jeśli czwarte pole zawiera, txtzostanie odczytany następny wiersz tekstu, który skrypt zacznie ponownie przetwarzać od początku.

Te nextsiły rachunku awk natychmiastowe przerwanie przetwarzania bieżącego rekordu i przejść do następnego rekordu. Oznacza to, że dla bieżącego rekordu nie są wykonywane żadne dalsze reguły, a reszta działania bieżącej reguły nie jest wykonywana.

Teraz rozważmy drugą część skryptu /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Tutaj, jeśli wiersz pasuje do wyrażenia regularnego /REG.*\(deleted\)$( $oznacza, że (deleted)powinno to być ostatnie słowo w wierszu), po prostu drukuje >/proc/%s/fd/%d\n", $2,$4.

W poleceniu lsof $4jest numer deskryptor pliku (na przykład 53w, gdy wśrodki filer został otwarty na piśmie) lub filetype, w zależności od pliku. Znak %dw printfzapewnia, że ​​zostaną wydrukowane tylko liczby, usuwając wszelkie znaki tekstowe (takie jak w). $2wypisuje identyfikator procesu, który korzysta z pliku, więc wydrukuje coś podobnego >/proc/3989/fd/53i tak dalej wydrukuje wszystkie pliki, które zostały usunięte, ale których deskryptor pozostaje otwarty, innymi słowy, deskryptory plików, które można bezpiecznie obciąć.


2

To polecenie obetnie usunięte pliki z lsof.

Ten pierwszy wyświetli listę otwartych plikówlsof

następnie poszukaj rekurencyjnie linii, która następnie {next}zawiera REG '$4~/txt/{next};/REG.*\(deleted\)$/jako czwarty parametr, a następnie ten proces względem tej linii zostanie usunięty

a następnie wydrukuj wszystkie wyniki bez linii zawierających REG i oznaczone jako usunięte.{printf ">/proc/%s/fd/%d\n", $2,$4}'


Myślę, że powinieneś wyjaśnić różne części polecenia (przynajmniej po to, by uzyskać moje poparcie).
don.joey

sprawdź moją aktualizację

1
Kiedy instrukcja awk z wyrażeniem regularnym i drukiem zaczęła obcinać rzeczywistą zawartość. Musisz przekazać to polecenie do shrzeczywistego obcięcia, a ponadto istnieją dwa wyrażenia regularne, nie jedno jak w twoim objaśnieniu
Stormvirux
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.