Como obter este resultado? perl / awk / sed? Como?

2

Como posso gerar a partir desta ENTRADA em "geral"

INPUT (/ proc / net / ip_conntrack)

udp      17 0 src=192.168.1.128 dst=91.120.112.125 sport=29249 dport=39802 packets=3 bytes=408 [UNREPLIED] src=91.120.112.125 dst=79.132.235.112 sport=39802 dport=29249 packets=0 bytes=0 mark=0 use=2
udp      17 146 src=192.168.1.128 dst=98.196.37.3 sport=56932 dport=43645 packets=924 bytes=406167 src=98.196.37.3 dst=79.132.235.112 sport=43645 dport=56932 packets=1042 bytes=546092 [ASSURED] mark=0 use=2
tcp      6 118 SYN_SENT src=192.168.1.129 dst=89.132.51.110 sport=2518 dport=47385 packets=2 bytes=104 [UNREPLIED] src=80.132.51.190 dst=79.132.235.112 sport=47385 dport=2518 packets=0 bytes=0 mark=0 use=2
udp      17 147 src=192.168.1.128 dst=98.196.37.7 sport=56937 dport=43647 packets=924 bytes=406167 src=98.196.37.7 dst=80.132.235.117 sport=43647 dport=56937 packets=1042 bytes=546092 [ASSURED] mark=0 use=2
tcp      6 119 SYN_SENT src=192.168.1.129 dst=89.132.51.110 sport=2514 dport=47384 packets=2 bytes=104 [UNREPLIED] src=80.132.51.194 dst=80.132.235.114 sport=47384 dport=2514 packets=0 bytes=0 mark=0 use=2
udp      17 163 src=192.168.1.111 dst=192.168.1.201 sport=67 dport=68 packets=29 bytes=9512 src=192.168.1.201 dst=192.168.1.1 sport=68 dport=67 packets=27 bytes=8856 [ASSURED] mark=0 use=2
tcp      6 1 TIME_WAIT src=192.168.1.201 dst=67.201.31.15 sport=55479 dport=80 packets=7 bytes=725 src=67.201.31.35 dst=79.132.235.112 sport=80 dport=55479 packets=5 bytes=1963 [ASSURED] mark=0 use=2

para esta saída?

OUTPUT

udp 192.168.1.128   3
tcp 192.168.1.129   2
udp 192.168.1.111   1
tcp 192.168.1.201   1

Assim, a partir dos dados INPUT, o OUTPUT seria de 3 colunas:

protocoll   src-ip-address  count-connection-numbers

Para que o IP com o maior número de conexões esteja no topo.

    
por LanceBaynes 22.06.2011 / 08:29

5 respostas

6

Usando sed , uniq , classificar , awk e coluna :

sed -n -r 's/^(udp|tcp)\s*[^=]*=([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}).*$/ /p' infile \
  | sort | uniq -c | sort -nr | awk '{print $2" "$3" "$1'} | column -t > outfile
    
por 22.06.2011 / 09:07
2

Você pode usar o perl one-liner para fazê-lo, é muito fácil!

perl -lane 'print "$F[0] $1" if /src=(.*?)\s/' /proc/net/ip_conntrack | sort | uniq -c | sort -rn -k 1
    
por 23.06.2011 / 16:13
2

Há duas etapas: extrair o protocolo e os endereços de origem e coletar e classificar. Você já sabe como fazer o segundo, então vamos ver como fazer o primeiro.

Você já tinha uma maneira de extrair os endereços de origem:

sed -ne 's/^.*src=\([^ ]*\).*//p'

Isso extrai o último campo src= embora; aqui queremos extrair o primeiro. É um pouco inconveniente em sed, mas pode ser feito.

sed -n -e 's/\(src=[^ ]*\).*//' -e 's/^.*src=\([^ ]*\).*//p'

Para manter o primeiro campo, basta aplicar o último substituto à peça após o primeiro espaço.

sed -n -e 's/\(src=[^ ]*\).*//' -e 's/ .*src=\([^ ]*\).*/ /p'

Isso é conciso e não muito claro. Aqui está uma maneira igualmente concisa, mas mais clara, de obter o mesmo resultado com o awk. Chame match para encontrar a extensão do primeiro campo src= , depois imprima a parte correspondente da linha.

awk 'match($0, / src=[^ ]*/) {print $1 substr($0, RSTART, RLENGTH)}'

Finalmente, canalize para o segundo estágio (classifique, obtenha contagens e classifique por contagem).

awk 'match($0, / src=[^ ]*/) {print $1 substr($0, RSTART, RLENGTH)}' |
sort | uniq -c | sort -nr
    
por 23.06.2011 / 02:04
1

Usando awk e sort :

/usr/bin/awk -F" " '
{
  proto = $1
  for(i = 2; i <= NF; ++i) 
  {
    if ($i ~ /^src=/) 
    { 
      scrip = $i
      srcip = sub(/^src=/, "", scrip)
      key = proto SUBSEP scrip
      a[key]+=1
    }
  }
}
END {
  for (var in a)
  {
    split(var, subkey, SUBSEP)
    printf "%-5s %-18s %-8s\n", subkey[1], subkey[2], a[var]
  }
}
' infile | sort -rn -k3,3
    
por 22.06.2011 / 13:56
0
#!/usr/bin/perl
use strict;
use warnings;

my %count;

# extract protocol and source-ip-address, count rows with same values
while(<>) {
  if (/^([^ ]+).*src=([0-9.]+)/) {
    $count{"$1 $2"}++;
  }
}

# sort by count
for my $p_src (sort {$count{$b} <=> $count{$a}} keys %count) {
  print "$p_src\t$count{$p_src}\n";
}

Exemplo (seus dados não são muito interessantes)

$ eg.pl eg.txt
tcp 67.201.31.35        1
tcp 80.132.51.190       1
tcp 80.132.51.194       1
udp 192.168.1.201       1
udp 91.120.112.125      1
udp 98.196.37.3 1
udp 98.196.37.7 1
    
por 22.06.2011 / 15:45