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?
command-line
Braiam
fuente
fuente
Respuestas:
Este comando imprimirá los archivos
lsof
que 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
next
declaració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
$4
es el número de descriptor de archivo (por ejemplo53w
, losw
medios el archivador se ha abierto para escritura) o de tipo de archivo, dependiendo del archivo. En%d
el seprintf
asegura que solo se imprimirán los números, eliminando los caracteres de texto (como elw
).$2
imprime la identificación del proceso que utiliza el archivo para que imprima algo así>/proc/3989/fd/53
y 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.fuente
Este comando truncará los archivos eliminados de lsof.
Este primero listará los archivos abiertos
lsof
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
sh
para truncamiento real y, además, hay dos expresiones regulares, no una como en su explicación