나는 다음을 가지고 있습니다 :
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 = ""
.
감사해요에드 모튼.