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
command-line
Braiam
la source
la source
Réponses:
Cette commande imprimera les fichiers à partir de
lsof
cette 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,
txt
la ligne de texte suivante sera lue, que le script recommencera à traiter depuis le début.L'
next
instruction 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
$4
est le numéro de descripteur de fichier (par exemple53w
, lew
moyen d'ouverture du fichier pour l'écriture) ou le type de fichier, selon le fichier. Le%d
dans leprintf
garantit que seuls les chiffres seront imprimés, supprimant tous les caractères de texte (comme lew
).$2
imprime l'id de processus du processus qui utilise le fichier pour qu'il imprime quelque chose comme>/proc/3989/fd/53
et 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é.la source
Cette commande tronquera les fichiers supprimés de lsof.
Cette première liste les fichiers ouverts
lsof
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
sh
pour la troncature réelle et de plus il y a deux expressions régulières, pas une comme dans votre explication