¿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?

Braiam
fuente
+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.

Stormvirux
fuente
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}'


fuente
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