我有大约 30,000 个 Apache 访问日志,其中一些列出了多个客户端 IP 地址。这是因为 Apache 记录了 X-Forwarded-For 标头而不是客户端的 IP 地址。这样做的原因是因为我们最近在 Web 服务器前添加了 haproxy。
展望未来,我们将使用Apache 的rpaf仅记录 1 个 IP 地址,即与 haproxy 的传入连接,因此这不会是一个持续存在的问题。
这让我想到了一个实际的问题:
如何处理具有多个 IP 地址的现有日志,以仅提取我想要的一个。我假设我需要 sed 或类似的东西,但我更像是一个 Windows 人,所以不能 100% 确定。
规则是:
- 如果只有 1 个 IP,则不修改该行。
- 如果有2个或更多IP,我只想保留倒数第二个IP。它们以逗号分隔。
示例 1,1 个 IP
输入:10.1.1.1 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
输出:10.1.1.1 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
示例 2,2 个 IP
输入:10.1.1.1 , 10.2.2.2 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
输出:10.1.1.1 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
示例 3,3 个 IP
输入: 10.1.1.1, 10.2.2.2 , 10.3.3.3 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
输出:10.2.2.2 - - [29/Jan/2010:11:00:00] ....(日志行的其余部分)
这可以通过在您的日志上运行此 sed 命令来实现:
一些解释:
s/MATCH PATTERN/REPLACE PATTERN/
\2
在括号中引用匹配的第二部分。(
和)
,加:(+
表示“至少一次”)和文字字符句点:(.
否则它被视为通配符)-i
选项意味着更改文件。确保您在副本上工作!“它让我的眼睛几乎和 Perl 一样多,但它确实有效。”
让我的眼睛少流血,但也许这只是我:-)