¿Qué hace lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Deleted \) $ / {printf “> / proc /% s / fd /% d \ n”, $ 2, $ 4}' comando media


9

Estoy leyendo algunos artículos y he visto este comando:

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

¿Podría algún cuerpo ayudarme a entenderlo?


+1 y favorito porque es una pregunta interesante. :-)
Lorenzo Ancora

Respuestas:


7

Este comando imprimirá los archivos lsofque necesiten truncamiento.

(En realidad , no elimina ni trunca ningún archivo).

lsof devolverá una lista de archivos abiertos (descriptores de archivo) que se canaliza en el awk que lo procesa de la siguiente manera.

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

La expresión anterior contiene dos expresiones regulares separadas por un punto y coma. ;

Consideremos la primera parte gawk '$4~/txt/{next};

Aquí, si el cuarto campo contiene txt, se leerá la siguiente línea de texto, que el script comenzará a procesar desde el principio nuevamente.

La nextdeclaración obliga a awk a detener inmediatamente el procesamiento del registro actual y pasar al siguiente registro. Esto significa que no se ejecutan más reglas para el registro actual, y el resto de la acción de la regla actual no se ejecuta.

Ahora consideremos la segunda parte del guión /REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'

Aquí, si la línea coincide con la expresión regular /REG.*\(deleted\)$(el $medio que (deleted)debería ser la última palabra en la línea), solo se imprime >/proc/%s/fd/%d\n", $2,$4.

En comando lsof $4es el número de descriptor de archivo (por ejemplo 53w, los wmedios el archivador se ha abierto para escritura) o de tipo de archivo, dependiendo del archivo. En %del se printfasegura que solo se imprimirán los números, eliminando los caracteres de texto (como el w). $2imprime la identificación del proceso que utiliza el archivo para que imprima algo así >/proc/3989/fd/53y así imprimirá todos los archivos que se hayan eliminado pero cuyo descriptor de archivo permanezca abierto, en otras palabras, descriptores de archivo que se pueden truncar de forma segura.


2

Este comando truncará los archivos eliminados de lsof.

Este primero listará los archivos abiertoslsof

luego busque líneas recursivamente una y luego una {next}que contenga REG '$4~/txt/{next};/REG.*\(deleted\)$/como el cuarto parámetro, luego este proceso relativo a esta línea se eliminará

y luego imprima todos los resultados sin las líneas que contienen REG y marcadas como eliminadas.{printf ">/proc/%s/fd/%d\n", $2,$4}'


Creo que deberías explicar las diferentes partes del comando (al menos para obtener mi voto positivo).
don.joey

compruebe mi actualización

1
Cuando hizo una declaración awk con regex y una declaración de impresión comenzó a truncar el contenido real. Debe pasar este comando a a shpara truncamiento real y, además, hay dos expresiones regulares, no una como en su explicación
Stormvirux
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.