我有以下内容:
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
and\s+
当我们可以只允许连续的空白转换为单个空格之后$1 = $2 = ""
。
谢谢埃德·莫顿。