我需要在 apache 日志中搜索错误代码,当找到该代码时,只显示该行的 IP 地址?使用 Linux 命令。
答案1
如果没有更多详细信息,这个问题很难回答,比如您正在寻找的“代码”是什么,IP 地址在相应行上的位置,是否包含相关代码的行总是在同一线路上有一个 IP 地址,是否有时有多个 IP 地址,以及您需要所有这些地址,等等。您需要允许 IPv6 地址还是仅允许 IPv4 地址?
如果您需要匹配 IPv4 或 IPv6,则调整答案这里在 stackoverflow 上,你可以使用类似的东西:
grep -E '[PATTERN]' access.log | grep -E -o -e '((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])' -e '(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))'
将“[PATTERN]”替换为您需要搜索的正则表达式。
这里的-E
标志用于扩展正则表达式,这使事情变得更容易。第一个 grep 实例将日志过滤为包含“[PATTERN]”的行。第二个 grep 实例查找 IP 地址,并用于-o
仅输出与适当格式匹配的行部分。第一个-e
表达式适用于 IPv4,第二个-e
表达式适用于 IPv6。
IPv6 的正则表达式是一个怪物。
也许可以简化为仅一个 grep 实例,但我们需要有关日志格式的更多详细信息(或者至少我会)。