shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script-pt] Parser em log pflogfile


From: Marcelo Primo
Subject: Re: [shell-script-pt] Parser em log pflogfile
Date: Thu, 11 Mar 2021 09:01:10 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:78.0) Gecko/20100101 Thunderbird/78.7.1

Bom dia Mestre, como estão as coisas?

Fiz a alteração sugerida e funcionou, no entanto, o tempo está na média dos primeiro comandos que postei (esse foi de 10s).

Agora, o que não me entra na cabeça é:
Porque 2 comandos (awk + cut) ou um monte de outros (linha original) acaba sendo mais rápido do que um único sed?
(não entro, nesse caso, no mérito de consumo de memória, apenas velocidade de processamento)

Muito obrigado pela sugestão e ajuda.

Atenciosamente,
Marcelo

Em 10/03/2021 20:01, Julio C. Neves escreveu:
Fala Marcelo,
quer dizer então que a culpa é minha, né? Vc que foi mordido pelo bichinho do perfeccionismo que o Shell colocana nossa cabeça.

Aí vai uma ER da boa para substituir o teu awk + cut, que deve ser mais rápida, experimente e nos conte. O sed a seguir, devolve só o endereço da porta (deve devolver, pq não testei).

sed -r 's/^[^>]+> ([0-9]{1,3}\.){4}([0-9]+):.*/\2/'

A ideia é ir casando a partir do início (^) tudo que não é > seguido de espaço ([^>]+> ). Em seguida caso os 4 octetos do IP ( ([0-9]{1,3}\.){4} ) e depois vem a porta que é o que interessa e por isso coloquei-a num grupo para usar o retrovisor 2.

Fiz de improviso sem pensar muito, mas pode haver algum processo melhor ainda, Lembre-se: "Nunca pergunte se dá para fazer em Shell! A pergunta correta é, qual é a melhor maneira para se fazer em Shell!

Abraços,
Julio
» Não tem tempo para fazer um curso presencial?
» Na sua cidade não tem nenhum bom curso de Linux?

Também damos treinamento em sua empresa
em qualquer cidadecom certificado e nota fiscal.








Em qua., 10 de mar. de 2021 às 17:23, Marcelo Primo por (shell-script-pt) <shell-script-pt@nongnu.org> escreveu:

Boa noite a todos,

Há um script (de autoria de outra pessoa) que efetua um parser em um arquivo de logs do PF que possui em média 800k linhas e ele faz um ranking nas portas atingidas no firewall (endereços em negrito).

As linhas são conforme as que seguem:

Mar 09 00:00:03.146758 rule 12/(match) pass in on em0: 198.199.88.65.61953 > 192.168.1.143.9004: S 3776023135:3776023135(0) win 1024
Mar 09 00:00:03.151840 rule 12/(match) pass in on em0: 198.199.88.65.61953 > 192.168.1.176.9004: S 4103556202:4103556202(0) win 1024
Mar 09 00:00:03.168233 rule 12/(match) pass in on em0: 203.212.200.241.58481 > 192.168.1.210.23: S 1794254071:1794254071(0) win 5808 <mss 1452,sackOK,timestamp 63610891 0,nop,wscale 2> (DF)
Mar 09 00:00:03.190210 rule 12/(match) pass in on em0: 178.175.97.53.46828 > 192.168.1.210.23: S 700145820:700145820(0) win 5808 <mss 1452,sackOK,timestamp 159224881 0,nop,wscale 1> (DF) [tos 0x4]
Mar 09 00:00:03.213339 rule 12/(match) pass in on em0: 131.159.24.205.51075 > 192.168.1.212.80: S 2924909527:2924909527(0) win 65535 <sackOK,timestamp 4294967295 16843009,wscale 1,nop,opt-34:,opt-64:,opt-30:00810c0c0c0c0c0c0c0c,eol>
Mar 09 00:00:03.263630 rule 12/(match) pass in on em0: 138.197.180.77.61953 > 192.168.1.194.10000: S 3809871894:3809871894(0) win 1024
Mar 09 00:00:03.394312 rule 12/(match) pass in on em0: 178.175.97.53.53172 > 192.168.1.210.23: S 2983985618:2983985618(0) win 33941 [tos 0x4]
Mar 09 00:00:03.500488 rule 12/(match) pass in on em0: 171.67.71.100.35957 > 192.168.1.249.8848: S 1091778644:1091778644(0) win 65535
Mar 09 00:00:03.637855 rule 12/(match) pass in on em0: 203.212.200.241.58457 > 192.168.1.210.23: S 1746544785:1746544785(0) win 5808 <mss 1452,sackOK,timestamp 63610938 0,nop,wscale 2> (DF)


Para fazer isso (o ranking), ele tem uma linha muito confusa, mas que faz o trabalho, segue abaixo:

zcat pflogtext.0.gz | grep " pass in" | grep -v "icmp"  | awk '{print $12}' | cut -d "." -f5 | sort  | uniq -c | sort -rn | head -n20 | awk '{print $1,$2}' | sed 's/ /;/g' | sed 's/://g'

(Essa linha vai no IP de destino, extrai a porta, conta e classifica de maneira inversa para encontrar as "top ports").

Apesar de, em um primeiro momento, essa linha parecer ineficiente, ela consome em média 2,9s para fazer o parser e retornar a saída abaixo:

184202;23
21960;22
18063;3389
17491;1433
17065;80
12519;5060
10853;8291
7263;7547
6144;8080
5498;443
3867;8728
3827;6379
3525;81
3284;123
2338;11211
2035;5555
1947;26
1912;8081
1892;82
1736;8182


Estou tentando deixar ela um pouco mais eficiente (culpa do Júlio... kkkk, pois no curso ministrado por ele, ele sempre diz: "Em shell há várias formas de fazer algo, basta saber se ela é a mais eficiente"), com isso em mente, comecei as mudanças, na tentativa de deixar a coisa mais clara e, se não melhor, ao menos no mesmo tempo. Minhas tentativas foram:

zgrep "pass in" pflogtext.0.gz | sed -E 's/.*\.([0-9]+):.*/\1/' | sort | uniq -c | sort -rn | head -n20 | tr -s ' ' =  13s

zgrep "pass in" pflogtext.0.gz | grep -Eo '(\.[0-9]+\:)' | sort | uniq -c | sort -rn | head -n20 | tr '[.:]' ' ' | tr -s ' ' = 12s

zgrep "pass in" pflogtext.0.gz | cut -d " " -f12 | cut -d "." -f5 | sort | uniq -c | sort -rn | head -n20 | tr '[.:]' ' ' | tr -s ' ' = 5,3s

zgrep "pass in" pflogtext.0.gz | awk '{print $12}' | cut -d "." -f5 | sort | uniq -c | sort -rn | head -n20 | tr '[.:]' ' ' | tr -s ' ' = 2,6s


Apesar da última linha estar "melhor" do que as anteriores, fiquei pensando se esse awk não está meio perdido (ou se teria uma forma melhor de usá-lo, essa combinação awk + cut não está agradando :D ).


Não sei se fui claro, mas aos que puderem e quiserem, estou aberto a sugestões.

Grato desde já.

Atenciosamente,

Marcelo



_______________________________________________
Lista brasileira de usuários de shell script
Endereço de e-mail da lista: shell-script-pt@nongnu.org
Para se inscrever ou desinscrever acesse: https://lists.nongnu.org/mailman/listinfo/shell-script-pt
Para ver os arquivos da lista (mensagens anteriores) e pesquisar nelas, acesse https://lists.nongnu.org/archive/html/shell-script-pt/

NOTA: A lista anterior, no Yahoo Groups, foi *desativada*. Por favor utilize somente esta.

reply via email to

[Prev in Thread] Current Thread [Next in Thread]