Como filtrar apenas arquivos fragmentados do log?

0

Supondo que acabei de concluir uma desfragmentação no sistema de arquivos ext4 em um disco rígido:

sudo e4defrag -v / > ~/defrag-2017-11-05 2>&1 &

O mais provável é que seja desnecessário, mas eu queria ver quais arquivos foram fragmentados.

O log se parece com:

==> defrag-2017-11-05 <==
ext4 defragmentation for directory(/)
[1/403415] "/"
    File is not regular file        [ NG ]
[2/403415] "/usr"
    File is not regular file        [ NG ]
[3/403415] "/usr/share"
    File is not regular file        [ NG ]
[4/403415] "/usr/share/ppp"
    File is not regular file        [ NG ]
[5/403415]^[[79;0H^[[K[5/403415]/usr/share/ppp/chap-secrets:    100%  extents: 1 -> 1   [ OK ]
[6/403415]^[[79;0H^[[K[6/403415]/usr/share/ppp/provider.chatscript: 100%  extents: 1 -> 1   [ OK ]
[7/403415]^[[79;0H^[[K[7/403415]/usr/share/ppp/provider.peer:   100%  extents: 1 -> 1   [ OK ]
[8/403415]^[[79;0H^[[K[8/403415]/usr/share/ppp/pap-secrets: 100%  extents: 1 -> 1   [ OK ]
[9/403415] "/usr/share/backgrounds"
    File is not regular file        [ NG ]
[10/403415] "/usr/share/backgrounds/linuxmint-retro"
    File is not regular file        [ NG ]
[11/403415]^[[79;0H^[[K[11/403415]/usr/share/backgrounds/linuxmint-retro/Gloria.jpg:    100%  extents: 1 -> 1   [ OK ]
[12/403415]^[[79;0H^[[K[12/403415]/usr/share/backgrounds/linuxmint-retro/aviatorjk_2441.jpg:    100%  extents: 1 -> 1   [ OK ]
[13/403415]^[[79;0H^[[K[13/403415]/usr/share/backgrounds/linuxmint-retro/theaeffect_3.png:  100%  extents: 1 -> 1   [ OK ]
[14/403415]^[[79;0H^[[K[14/403415]/usr/share/backgrounds/linuxmint-retro/multigons.jpg: 100%  extents: 1 -> 1   [ OK ]
[15/403415]^[[79;0H^[[K[15/403415]/usr/share/backgrounds/linuxmint-retro/Felicia.png:   100%  extents: 1 -> 1   [ OK ]
[16/403415]^[[79;0H^[[K[16/403415]/usr/share/backgrounds/linuxmint-retro/LinuxMint.png: 100%  extents: 1 -> 1   [ OK ]
[17/403415]^[[79;0H^[[K[17/403415]/usr/share/backgrounds/linuxmint-retro/air.jpg:   100%  extents: 1 -> 1   [ OK ]
[18/403415]^[[79;0H^[[K[18/403415]/usr/share/backgrounds/linuxmint-retro/curve.jpg: 100%  extents: 1 -> 1   [ OK ]
[19/403415]^[[79;0H^[[K[19/403415]/usr/share/backgrounds/linuxmint-retro/fizzy.jpg: 100%  extents: 1 -> 1   [ OK ]
[20/403415]^[[79;0H^[[K[20/403415]/usr/share/backgrounds/linuxmint-retro/silent_green.jpg:  100%  extents: 1 -> 1   [ OK ]
[21/403415]^[[79;0H^[[K[21/403415]/usr/share/backgrounds/linuxmint-retro/aviatorjk_2112.jpg:    100%  extents: 1 -> 1   [ OK ]
[22/403415]^[[79;0H^[[K[22/403415]/usr/share/backgrounds/linuxmint-retro/Emotion.jpg:   100%  extents: 1 -> 1   [ OK ]
[23/403415]^[[79;0H^[[K[23/403415]/usr/share/backgrounds/linuxmint-retro/pr09studio_spring.png: 100%  extents: 1 -> 1   [ OK ]
[24/403415]^[[79;0H^[[K[24/403415]/usr/share/backgrounds/linuxmint-retro/Talento-1.jpg: 100%  extents: 1 -> 1   [ OK ]
[324150/403415]^[[79;0H^[[K[324150/403415]/home/ruzena/StaM-EM->enM-CM-)/Altitude.2017.DVDRip.XviD.AC3-EVO/Altitude.2017.DVDRip.XviD.AC3-EVO.avi:   100%  extents: 20 -> 20 [ OK ]
[324290/403415]^[[79;0H^[[K[324290/403415]/home/ruzena/StaM-EM->enM-CM-)/Savage.Dog.2017.BRRip.XviD.AC3-EVO/Savage.Dog.2017.BRRip.XviD.AC3-EVO.avi: 100%  extents: 20 -> 20 [ OK ]
[325184/403415]^[[79;0H^[[K[325184/403415]/home/ruzena/StaM-EM->enM-CM-)/Death.Race.2050.2017.DVDRip.XviD.AC3-EVO/Death.Race.2050.2017.DVDRip.XviD.AC3-EVO.avi: 100%  extents: 20 -> 20 [ OK ]
[325356/403415]^[[79;0H^[[K[325356/403415]/home/ruzena/StaM-EM->enM-CM-)/Kong.Skull.Island.2017.TS.XviD.AC3-RUSSIAN.avi:    100%  extents: 20 -> 20 [ OK ]
[352147/403415]^[[79;0H^[[K[352147/403415]/home/ruzena/.cache/google-chrome/Default/Cache/d9b788060b0d42ce_0:     0%^[[79;0H^[[K[352147/403415]/home/ruzena/.cache/google-chrome/Default/Cache/d9b788060b0d42ce_0:  100%  extents: 5 -> 1   [ OK ]
[352943/403415]^[[79;0H^[[K[352943/403415]/home/ruzena/.cache/google-chrome/Default/Cache/d7789aeea4cbf251_1:     0%^[[79;0H^[[K[352943/403415]/home/ruzena/.cache/google-chrome/Default/Cache/d7789aeea4cbf251_1:  100%  extents: 5 -> 1   [ OK ]
[354676/403415]^[[79;0H^[[K[354676/403415]/home/ruzena/.cache/google-chrome/Default/Cache/98b71219db7f9992_1:     0%^[[79;0H^[[K[354676/403415]/home/ruzena/.cache/google-chrome/Default/Cache/98b71219db7f9992_1:  100%  extents: 5 -> 1   [ OK ]
[400977/403415]^[[79;0H^[[K[400977/403415]/home/ruzena/.local/share/zeitgeist/fts.index/postlist.DB:      0%^[[79;0H^[[K[400977/403415]/home/ruzena/.local/share/zeitgeist/fts.index/postlist.DB:   100%  extents: 5 -> 1   [ OK ]

Como não tenho experiência com awk e ferramentas semelhantes, pergunto-me:

Como filtrar apenas arquivos fragmentados do log? Se possível mesmo ...

Para especialistas: se você pudesse classificá-lo pelos arquivos mais fragmentados, isso seria incrível, mas não uma condição para responder a essa pergunta.

Uma linha na qual não quero ver final:

... extents: 1 -> 1 [ OK ]

Linhas que quero ver terminadas em:

... extents: 5 -> 1 [ OK ]
...  extents: 20 -> 5   [ OK ]

Onde preciso mostrar apenas linhas com 5 ou qualquer número que exista nesse mesmo local, maior que 1 obviamente.

EDITAR:

Exemplo de saída da desfragmentação detalhada para você tentar os comandos em:

link

Apenas extraia e você está pronto para ir.

    
por Vlastimil 05.11.2017 / 09:18

1 resposta

2
awk '{ if ($4!=$6) print $4 - $6" "$0_}' ~/defrag-2017-11-05 | sort -g 

Usamos o awk para comparar as duas colunas na entrada para ver se elas não são iguais e imprimir a diferença nos valores seguidos pelas linhas inteiras. Então, classificamos as linhas filtradas pelas diferenças que adicionamos no início da linha.

Se você quiser verificar as linhas com o primeiro número maior que 1, você pode usar

awk '{ if ($4>1) print $0_}' ~/defrag-2017-11-05 | sort -gk4

Aqui, simplesmente classificamos a quarta coluna em vez de criar uma nova coluna de diferença.

Editar

Para manipular espaços em nomes de arquivos e caracteres estranhos no início das linhas e filtrar outras linhas, use

awk '/extents: / { sub(/.*\]\//, "/"); sub(/:/, "", $1); if ($(NF-5)!=$(NF-3)) print $(NF-5) - $(NF-3)" "$1 }' ~/defrag-2017-11-05 | sort -g

Aqui está o script awk formatado bem para facilitar a leitura

/extents: / { 
  sub(/.*\]\//, "/");
  sub(/:/, "", $1);
  if ($(NF-5)!=$(NF-3)) print $(NF-5) - $(NF-3)" "$1
}
  1. filtra qualquer linha que não tenha extents: .
  2. substitui os caracteres iniciais por ]/ por / para remover as bobagens no início das linhas.
  3. remove : do nome do arquivo para torná-lo um pouco mais limpo
  4. compara os dois campos nos preocupamos em contar a partir do final da string e imprime as linhas onde os dois números diferem com essa diferença.
por 05.11.2017 / 10:15