AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 107478
Accepted
ThatGraemeGuy
ThatGraemeGuy
Asked: 2010-01-30 01:30:04 +0800 CST2010-01-30 01:30:04 +0800 CST 2010-01-30 01:30:04 +0800 CST

从一行文本中的 2 个或多个中提取 1 个 IP 地址

  • 772

我有大约 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] ....(日志行的其余部分)

text sed
  • 2 2 个回答
  • 2678 Views

2 个回答

  • Voted
  1. Best Answer
    Jonathan Clarke
    2010-01-30T02:18:00+08:002010-01-30T02:18:00+08:00

    这可以通过在您的日志上运行此 sed 命令来实现:

    sed -i "s/^\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+, \)*\([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\), [0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+ - -/\2 - -/"
    

    一些解释:

    • 一般格式是s/MATCH PATTERN/REPLACE PATTERN/
    • 匹配是在字符串“some IP”(0到多次)后跟“some IP”(这是我们要保留的)和最后“some IP - -”(最后一个要丢弃的IP)上完成的
    • 无需匹配行的第一种格式(只有一个 IP),因为它不需要更改。
    • 最后一部分包含\2在括号中引用匹配的第二部分。
    • 在 shell 中运行时,许多字符必须转义(使用反斜杠:),例如括号:(和),加:(+表示“至少一次”)和文字字符句点:(.否则它被视为通配符)
    • sed的-i选项意味着更改文件。确保您在副本上工作!
    • 7
  2. Kyle Brandt
    2010-01-30T05:52:13+08:002010-01-30T05:52:13+08:00

    “它让我的眼睛几乎和 Perl 一样多,但它确实有效。”

    use strict;
    use warnings;
    use Regexp::Common qw /net/;
    
    my $ip;
    my $restOfLine;
    my @ips;    
    
    while (<>) {
        if (/- -.*/) {
            $restOfLine = $&;
        }
        unless (@ips = /($RE{net}{IPv4})/g) {
            print;
            next;
        }
        if ($ips[1]) {
            $ip = splice(@ips,-2,1);
        } else {
            $ip = $ips[0];
        }
        print "$ip " . $restOfLine . "\n";
    }
    

    让我的眼睛少流血,但也许这只是我:-)

    • 0

相关问题

  • 从列表中的某些分隔字段中删除文本

  • 多种模式搜索和替换工具

  • 要归档的 DHCP 租用信息

  • 如何将所有组策略导出为易于解析的格式?

  • 如何远程控制Windows?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    从 IP 地址解析主机名

    • 8 个回答
  • Marko Smith

    如何按大小对 du -h 输出进行排序

    • 30 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    MikeN 在 Nginx 中,如何在维护子域的同时将所有 http 请求重写为 https? 2009-09-22 06:04:43 +0800 CST
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    0x89 bash中的双方括号和单方括号有什么区别? 2009-08-10 13:11:51 +0800 CST
  • Martin Hope
    Kyle Brandt IPv4 子网如何工作? 2009-08-05 06:05:31 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve