如何对实时提要进行排序或统一

如何对实时提要进行排序或统一

我希望对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小时。

相关内容