Estou lendo alguns artigos e vi este comando:
lsof|gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Algum corpo poderia me ajudar a entendê-lo
command-line
Braiam
fonte
fonte
Respostas:
Este comando imprimirá arquivos
lsof
que precisam de truncamento.(Na verdade, ele não remove nem trunca nenhum arquivo).
lsof
retornará uma lista de arquivos abertos (descritores de arquivo) que são canalizados para o awk que processa da seguinte maneira.gawk '$4~/txt/{next};/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
A expressão acima contém duas expressões regulares separadas por ponto e vírgula
;
vamos considerar a primeira parte
gawk '$4~/txt/{next};
Aqui, se o quarto campo contiver
txt
, a próxima linha de texto será lida, que o script começará a processar desde o início novamente.A
next
instrução força o awk a parar imediatamente o processamento do registro atual e passar para o próximo registro. Isso significa que nenhuma regra adicional é executada para o registro atual e o restante da ação da regra atual não é executada.Agora vamos considerar a segunda parte do script
/REG.*\(deleted\)$/{printf ">/proc/%s/fd/%d\n", $2,$4}'
Aqui, se a linha corresponder à expressão regular
/REG.*\(deleted\)$
(o$
meio que(deleted)
deve ser a última palavra na linha), ela será impressa>/proc/%s/fd/%d\n", $2,$4
.No comando lsof
$4
está o número do descritor do arquivo (por exemplo53w
, ow
meio que o arquivador foi aberto para gravação) ou o tipo de arquivo, dependendo do arquivo. O%d
noprintf
garante que apenas os números serão impressos, removendo os caracteres de texto (como ow
).$2
imprime a identificação do processo que usa o arquivo para imprimir algo assim>/proc/3989/fd/53
e assim por diante, imprime todos os arquivos que foram excluídos, mas cujo descritor de arquivo permanece aberto, ou seja, descritores de arquivo que podem ser truncados com segurança.fonte
Este comando truncará os arquivos excluídos do lsof.
Este primeiro listará os arquivos abertos
lsof
procure linhas recursivamente uma e outra
{next}
que contenha REG'$4~/txt/{next};/REG.*\(deleted\)$/
como o quarto parâmetro, em seguida, esse processo relativo a essa linha será excluídoe imprima todos os resultados sem as linhas que contêm REG e marcadas como excluídas.
{printf ">/proc/%s/fd/%d\n", $2,$4}'
fonte
sh
para truncamento real e, sempre que houver duas expressões regulares, não uma como na sua explicação