uniq - IP 주소를 무시하는 방법?

uniq - IP 주소를 무시하는 방법?

나는 다음을 가지고 있습니다 :

cat /var/log/example.log | cut -d ' ' -f 3,4,5,6 | sort -u | uniq

결과에는 수천 개의 행이 있지만 실제 활동을 표시하기 위해 잘라내기를 원하며 이를 위해서는 IP 주소를 제외/무시해야 합니다.

따라서 로그에는 다음과 같은 기록이 있습니다.

2021-12-30 19:46:44 Invalid heartbeat from X.X.X.X
2021-12-30 19:46:44 X.X.X.X sent a malformed request
2021-12-30 19:46:44 Login from X.X.X.X failed due to bad username
2021-12-30 19:46:44 Failed login from this IP X.X.X.X

수만 개의 레코드가 있습니다. 활동을 어떻게 얻나요?

Invalid heartbeat from 
sent a malformed request
Login from failed due to bad username
Failed login from this IP 

감사해요

답변1

sed다음을 사용하여 정렬하기 전에 IP 주소를 제거 할 수 있습니다 .

cut -d ' ' -f 3- /var/log/example.log | sed -E 's/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}//g' | sort -u

cut -f 3-- 세 번째 행부터 행 끝까지의 모든 필드가 제공됩니다.

답변2

해결책을 원한다면 awk여기에 있습니다.

awk '
{
        for (i = 1; i <= NF - 2; i++) {
                $i = $(i + 2)
        }
        NF -= 2
        gsub(/[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}/, "", $0)
        print
}
' /var/log/example.log | sort -u

답변3

분명히 이것이 더 잘 작동합니다.

awk '{ gsub(/[0-9]{1,3}(\.[0-9]{1,3}){3}/, ""); $1 = $2 = "";
    gsub(/^ +| +$/, "") } !seen[$0]++' /var/log/example.log

의존할 필요가 없으며 \s연속 \s+된 공백을 단일 공백으로만 변환할 수 있는 경우입니다 $1 = $2 = "".

감사해요에드 모튼.

관련 정보