
「一般」のこの入力からどのように生成しますか?
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
プロトコルとソースアドレスの抽出、収集、構成の2つの段階に分けられます。あなたすでに知っていた2番目のタスクを実行する方法、1番目のタスクを実行する方法を見てみましょう。
あなたすでに持っているソースアドレスを抽出するには:
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)}'
最後に、パイプラインを介して2番目のステップ(ソート、カウントのインポート、およびカウントによるソート)に進みます。
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