![如何对实时提要进行排序或统一](https://linux22.com/image/90124/%E5%A6%82%E4%BD%95%E5%AF%B9%E5%AE%9E%E6%97%B6%E6%8F%90%E8%A6%81%E8%BF%9B%E8%A1%8C%E6%8E%92%E5%BA%8F%E6%88%96%E7%BB%9F%E4%B8%80.png)
我希望对tcpdump
实时源中的 IP 进行排序和隔离。
tcpdump -n -i tun0 "tcp[tcpflags] & (tcp-syn) != 0" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}
工作得很好,但是当我尝试添加程序时uniq
它失败了:
tcpdump -n -i tun0 "tcp[tcpflags] & (tcp-syn) != 0" | grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" | uniq -u
什么也不返回。
与 相同sort -u
。
关于如何解决这个问题有什么想法吗?
答案1
你遇到了一个理论问题。sort
在处理完所有输入之前,根本无法打印任何内容。uniq
只会挤压重复的行(这就是为什么它前面经常带有sort
),因此只有当输入连续两次具有相同的行时,您的输出才会与输入不同。如果您的输入有点随机,您可能不会注意到差异。
最好的选择是一个简单的 Perl 程序,它逐行读取输入,并检查它是否已经被看到。如果没有,则它打印输入并将其添加到已看到输入的哈希表中。
#!/usr/bin/perl
my %LINES ;
while (<STDIN>) {
if (! $LINES{$_}) {
$LINES{$_} = 1 ;
print $_ ;
}
}
当然,您已经看到的行列表会增加,程序占用的内存也会增加。
我不确定你会用它做什么,但我想我会将当前日期添加到打印中,也许添加到哈希中,这样就可以在之后删除输入n小时。