O que o comando lsof | gawk '$ 4 ~ / txt / {next}; / REG. * \ (Excluído \) $ / {printf "> / proc /% s / fd /% d \ n", $ 2, $ 4}' ' significar

9

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

Braiam
fonte
+1 e favorito porque é uma pergunta interessante. :-)
Lorenzo Ancora

Respostas:

7

Este comando imprimirá arquivos lsofque 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 nextinstruçã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 $4está o número do descritor do arquivo (por exemplo 53w, o wmeio que o arquivador foi aberto para gravação) ou o tipo de arquivo, dependendo do arquivo. O %dno printfgarante que apenas os números serão impressos, removendo os caracteres de texto (como o w). $2imprime a identificação do processo que usa o arquivo para imprimir algo assim >/proc/3989/fd/53e 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.

Stormvirux
fonte
2

Este comando truncará os arquivos excluídos do lsof.

Este primeiro listará os arquivos abertoslsof

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ído

e 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
Eu acho que você deve explicar as diferentes partes do comando (pelo menos para obter o meu voto positivo).
don.joey
verifique minha atualização
11
Quando uma instrução awk com regex e um grampo de impressão começaram a truncar o conteúdo real. Você precisa passar este comando para a shpara truncamento real e, sempre que houver duas expressões regulares, não uma como na sua explicação
Stormvirux