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
lsofque necesiten truncamiento.(En realidad , no elimina ni trunca ningún archivo).
lsofdevolverá 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 ejemplo53w, loswmedios el archivador se ha abierto para escritura) o de tipo de archivo, dependiendo del archivo. En%del seprintfasegura que solo se imprimirán los números, eliminando los caracteres de texto (como elw).$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.fuente
Este comando truncará los archivos eliminados de lsof.
Este primero listará los archivos abiertos
lsofluego 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
shpara truncamiento real y, además, hay dos expresiones regulares, no una como en su explicación