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

9

Je lis des articles et j'ai vu cette commande:

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

Un corps pourrait-il m'aider à le comprendre

Braiam
la source
+1 et favori car c'est une question intéressante. :-)
Lorenzo Ancora

Réponses:

7

Cette commande imprimera les fichiers à partir de lsofcette troncature.

(Il ne supprime ni ne tronque aucun fichier).

lsof renverra une liste de fichiers ouverts (descripteurs de fichiers) qui sont dirigés vers l'awk qui les traite comme suit.

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

L'expression ci-dessus contient deux expressions régulières séparées par un point-virgule ;

considérons la première partie gawk '$4~/txt/{next};

Ici, si le 4ème champ contient, txtla ligne de texte suivante sera lue, que le script recommencera à traiter depuis le début.

L' nextinstruction force awk à arrêter immédiatement le traitement de l'enregistrement en cours et à passer à l'enregistrement suivant. Cela signifie qu'aucune autre règle n'est exécutée pour l'enregistrement en cours et que le reste de l'action de la règle en cours n'est pas exécuté.

Voyons maintenant la deuxième partie du script /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Ici, si la ligne correspond à l'expression régulière /REG.*\(deleted\)$(le $moyen qui (deleted)devrait être le dernier mot de la ligne), elle s'imprime >/proc/%s/fd/%d\n", $2,$4.

Dans la commande lsof $4est le numéro de descripteur de fichier (par exemple 53w, le wmoyen d'ouverture du fichier pour l'écriture) ou le type de fichier, selon le fichier. Le %ddans le printfgarantit que seuls les chiffres seront imprimés, supprimant tous les caractères de texte (comme le w). $2imprime l'id de processus du processus qui utilise le fichier pour qu'il imprime quelque chose comme >/proc/3989/fd/53et ainsi de suite il imprimera tous les fichiers qui ont été supprimés mais dont le descripteur de fichier reste ouvert, en d'autres termes, des descripteurs de fichier qui peuvent être tronqués en toute sécurité.

Stormvirux
la source
2

Cette commande tronquera les fichiers supprimés de lsof.

Cette première liste les fichiers ouvertslsof

puis recherchez les lignes récursivement une puis une {next}qui contiennent REG '$4~/txt/{next};/REG.*\(deleted\)$/comme quatrième paramètre puis ce processus relatif à cette ligne sera supprimé

puis imprimez tous les résultats sans les lignes contenant REG et marquées comme supprimées.{printf ">/proc/%s/fd/%d\n", $2,$4}'


la source
Je pense que vous devriez expliquer les différentes parties de la commande (au moins pour obtenir mon vote positif).
don.joey
vérifier ma mise à jour
1
Quand une instruction awk avec regex et une impression a-t-elle commencé à tronquer le contenu réel.Vous devez passer cette commande à un shpour la troncature réelle et de plus il y a deux expressions régulières, pas une comme dans votre explication
Stormvirux