라이브 피드를 정렬하거나 통합하는 방법

라이브 피드를 정렬하거나 통합하는 방법

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시간.

관련 정보