Cosa significa lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Cancellato \) $ / {printf “> / proc /% s / fd /% d \ n”, $ 2, $ 4}' significare


9

Sto leggendo alcuni articoli e ho visto questo comando:

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

Qualcuno potrebbe aiutarmi a capirlo


+1 e preferito perché è una domanda interessante. :-)
Lorenzo Ancora,

Risposte:


7

Questo comando stamperà i file lsofche richiedono il troncamento.

(In realtà non rimuove o tronca alcun file).

lsof restituirà un elenco di file aperti (descrittori di file) che vengono reindirizzati nel awk che lo elabora come segue.

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

L'espressione sopra contiene due espressioni regolari separate da un punto e virgola ;

consideriamo la prima parte gawk '$4~/txt/{next};

Qui, se il quarto campo contiene, txtverrà letta la riga successiva di testo, che lo script inizierà a elaborare dall'inizio.

L' nextistruzione impone a awk di interrompere immediatamente l'elaborazione del record corrente e passare al record successivo. Ciò significa che non vengono eseguite ulteriori regole per il record corrente e il resto dell'azione della regola corrente non viene eseguito.

Ora consideriamo la seconda parte dello script /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Qui se la riga corrisponde all'espressione regolare /REG.*\(deleted\)$(il $mezzo che (deleted)dovrebbe essere l'ultima parola sulla riga), viene semplicemente stampata >/proc/%s/fd/%d\n", $2,$4.

Nel comando lsof $4è il numero del descrittore di file (ad esempio 53w, wsignifica che il filer è stato aperto per la scrittura) o il tipo di file, a seconda del file. Il %din printfassicura che verranno stampati solo i numeri, rimuovendo tutti i caratteri di testo (come il w). $2stampa l'identificativo del processo che utilizza il file in modo che stampi qualcosa di simile >/proc/3989/fd/53e così via stamperà tutti i file che sono stati eliminati ma il cui descrittore di file rimane aperto, in altre parole, descrittori di file che possono essere troncati in modo sicuro.


2

Questo comando tronca i file eliminati da lsof.

Questo primo elencherà i file apertilsof

quindi cerca ricorsivamente una riga, quindi una {next}che contenga REG '$4~/txt/{next};/REG.*\(deleted\)$/come quarto parametro, quindi questo processo relativo a questa riga verrà eliminato

e quindi stampare tutti i risultati senza le righe contenenti REG e contrassegnati come eliminati.{printf ">/proc/%s/fd/%d\n", $2,$4}'


Penso che dovresti spiegare le diverse parti del comando (almeno per ottenere il mio voto).
don.joey,

controlla il mio aggiornamento

1
Quando ha fatto un'affermazione awk con regex e uno stato di stampa ha iniziato a troncare i contenuti sheffettivi. Devi passare questo comando a un troncamento effettivo e inoltre ci sono due espressioni regolari non una come nella tua spiegazione
Stormvirux
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.