이 출력을 얻는 방법은 무엇입니까? 펄/awk/sed? 어떻게?

이 출력을 얻는 방법은 무엇입니까? 펄/awk/sed? 어떻게?

"일반"의 이 입력에서 어떻게 생성합니까?

Enter (/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

이 출력에?

산출

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

따라서 입력 데이터를 기반으로 출력은 3개의 열이 됩니다.

protocoll   src-ip-address  count-connection-numbers

이렇게 하면 연결이 가장 많은 IP가 맨 위에 표시됩니다.

답변1

사용sed,고유한,유형,그리고기둥:

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

답변2

Perl one-liner를 사용하면 매우 쉽습니다!

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

답변3

프로토콜과 소스 주소 추출, 수집 및 구성의 두 단계로 나뉩니다. 너이미 알고 있었어두 번째 작업을 수행하는 방법, 첫 번째 작업을 수행하는 방법을 살펴보겠습니다.

이미 갖고 있어소스 주소를 추출하는 방법:

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

그러나 이것은 마지막 src=필드를 추출합니다. 여기서는 첫 번째 필드를 추출하려고 합니다. sed에서는 약간 불편하지만 할 수 있습니다.

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

첫 번째 필드를 유지하려면 첫 번째 공백 뒤의 부품에 마지막 교체를 적용하면 됩니다.

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

이 문장은 매우 간결하고 명확하지 않습니다. 이는 awk를 사용하여 동일한 출력을 얻는 똑같이 간결하지만 깔끔한 방법입니다. 호출은 match첫 번째 필드의 범위를 찾은 src=다음 줄의 해당 부분을 인쇄합니다.

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

마지막으로 파이프라인을 통해 두 번째 단계(정렬, 개수 가져오기 및 개수별 정렬)로 이동합니다.

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

답변4

#!/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";
}

예(귀하의 데이터는 그다지 흥미롭지 않습니다)

$ 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

관련 정보