仅从日志文件中获取 IP 地址并保存到文件、表格或 .CSV

Posted

技术标签:

【中文标题】仅从日志文件中获取 IP 地址并保存到文件、表格或 .CSV【英文标题】:Take IP Addresses only from log file and save to File, Table, or .CSV 【发布时间】:2017-03-07 02:15:37 【问题描述】:

我有一个日志文件,其中包含如下条目:

2010-09-13 00:00:01 69.143.116.98 - W3SVC2 STREAM 209.22.66.152 80 GET /p7pm/p7popmenu.js - 200 0 7700 379 188 .org Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.0;+WOW64;+GoogleT5;+SLCC1;+.NET+CLR+2.0.50727;+Media+Center+PC+5.0;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30618;+.NET4.0C) - .org/
Mozilla/5.0+(compatible;+Yahoo!+Slurp/3.0;+.com) - waste.html
2010-09-13 08:52:15 67.195.112.157 - W3SVC2 STREAM 209.22.66.152 80 GET /includes/Center_nav_p4.css - 304 0 164 482 0 HTTP/1.0 LOL.org Mozilla/5.0+(compatible;+Yahoo!+Slurp/3.0;+.com) - waste.html

我在想的是提取每个日志条目的 IP 地址并将其保存为数据库中的行或行的最佳方法。我可能会先保存到一个列表或类似的东西中,然后保存到一个只有 IP 地址的 db、csv 或文本文件中。

类似这样的:

"69.143.116.98" 
"65.37.53.228" 
"169.123.16.100" 
"169.123.16.12" 
"169.123.16.9" 
"169.123.6.89" 

看起来 IP 地址从第 21 行开始,所以我想我可以以某种方式从那里开始,然后弄清楚如何获取其余的 IP。 也许像从 21 号开始,然后抓住所有的东西,直到我找到一个空格?

在我将它们全部抓取后,我会对它们进行计数和排序,然后将它们保存为最终格式。

我在正确的道路上吗? 谢谢。

显然我没有在这里完成整个任务;看来这会有点困难。涉及大量排序;我想第一部分是抓取这些数据并放入某种表格中,然后进行所有这些排序,最后写出计数,IP 在排序到 csv 后............

我需要在这个日志文件中进行解析,这就是需要发生的事情;太疯狂了:

1.) 代码将计算日志文件中包含的 IP 地址发出的请求数。

2.) 代码将仅计算通过用于 HTTP 的标准端口发出的 GET 请求,并应从计数中排除所有以“207.114”开头的 IP 发出的请求。

    )最终的 CSV 文件应进行排序,以便首先列出发出最多请求的 IP。

    ) 发出相同数量请求的 IP 应在它们之间进行排序,其中较大值的 IP 八位字节首先列出。

    )第一列应包含请求的数量,第二列将包含发出请求的 IP 地址。 SomeFromLog.csv - 基于以下数据的示例:

8,“69.143.116.98”

3,“65.37.53.228”

1,“169.123.16.100”

1,“169.123.16.12”

1,“169.123.16.9”

1,“169.123.6.89”

【问题讨论】:

对于这样的任务,了解源数据的格式总是很重要。它看起来像来自 Web 服务器的日志,你能告诉我们哪个 Web 服务器以及设置了哪些日志记录选项吗? 这是一个我相信来自 IIS 的 .log 文件,其中每一行如下所示: 2010-08-12 08:52:58 63.160.106.254 - W3SVC111 STREAM 207.22.66.152 80 GET /includes/scripts .js - 304 0 164 456 0 HTTP/1.1 www.LOL.org Mozilla/4.0+(兼容;+MSIE+6.0;+Windows+NT+5.1;+SV1;+.NET+CLR+1.1.4322;+。 NET+CLR+2.0.50727) __utma=228961600.1845892080.1265608268.1279440521.1279522956.43 LOL.org 我认为它需要以某种方式逐行读取并解析,以便整个事情最终在数据库表中进行排序完成/问题是;那部分怎么做? IIS 支持 3 种开箱即用的格式和插件以几乎任何格式存储日志。但是,如果您没有更改任何设置,它可能是 W3C 扩展日志文件格式(请参阅w3.org/TR/WD-logfile.html)。请注意,并非这种格式的每一行都是相同的,其中一些行是描述其他行结构的“指令”,这些行以 # 开头。此外,使用配置设置,有时可以在文件的一部分中添加或删除列。因此,最好使用预先编写的解析器。 Yann 在下面建议的选择似乎是一个合理的选择。 1.我看到这样做的方式是将日志文件的每一行读入 list LogFileList = new list();某种。 2. 现在我们有一个列表中的日志文件行,我们遍历该列表并在第一遍消除以“207.114”开头的 IP 发出的请求。 3. 再次运行并消除端口 80 上不是 GET 的行。 4. 现在我们创建第二个 List =LogFileResults = new List();或者可以是一个 List 来保存最终结果。 5.我们需要从 LogFileList 中取出每一行并检查 IP 地址,如果这已经在 LogFileResults 中,那么我们只需将该 IP 的计数设为 1,如果没有,那么这是一个新的 IPaddress 条目,我们将其添加到 LogFileResults 为另一排。 6. 最后,我们应该对每个 IP 地址进行计数,结果中没有任何重复的 IP 地址。 12, "64.143.116.98" 4, "65.37.53.228" 2, "166.123.16.100" 1, "166.123.16.12" 你将如何在 C# 中执行此操作? 【参考方案1】:

您可以从 nugget 安装 TX.Windows: https://www.nuget.org/packages/Tx.Windows

PM > Install-Package Tx.Windows

然后像这样使用它:

        var iisLog = W3CEnumerable.FromFile(pathToLog);
        List<string> IpsLog = new List<string>();
        foreach (var item in iisLog)
        
            IpsLog.Add(item.c_ip);
        

如果日志文件被其他进程使用,可以使用W3CEnumerable.FromStream

【讨论】:

我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,看来需要进行大量排序才能完成此操作。【参考方案2】:
string line = string.Empty;
using(StreamReader sr = new StreamReader("path/to/file")) 
    while((line = sr.ReadLine())!=null) 
        var matches = Regex.Match(line, @"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.)3
(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$");
        if(matches == null) continue;
        foreach(var group in match.Group) 
            //Do your staff here
        
    

使用这个Regex,您将只能匹配有效的IP,如果没有匹配的IP,它将继续while循环(根据if语句)

【讨论】:

我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,似乎需要进行大量排序才能完成此操作。我考虑过使用 LogParser,但有没有办法用代码做同样的事情?【参考方案3】:

添加命名空间,

System.Text.RegularExpressions

然后使用正则表达式

  string pattern = @"\b(?:(?:2(?:[0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9])\.)3(?:(?:2([0-4][0-9]|5[0-5])|[0-1]?[0-9]?[0-9]))";
        Regex r = new Regex(pattern);
        string input =File.ReadAllText(path) ;
        MatchCollection matches = r.Matches(input);
        foreach (Match match in matches)
            Console.WriteLine(match.Value);

这样您将获得一个数组中的所有 IP 地址。 您可以使用 regexr 来检查正则表达式:http://regexr.com/

【讨论】:

我将如何使用它来将整个日志文件解析为 SQL 表或我们可以使用的可排序的东西?我在上面编辑了我的答案,似乎需要进行大量排序才能完成此操作。我考虑过使用 LogParser,但有没有办法用代码做同样的事情?

以上是关于仅从日志文件中获取 IP 地址并保存到文件、表格或 .CSV的主要内容,如果未能解决你的问题,请参考以下文章

在ansible中使用for循环从保存在主机服务器上的文件中获取IP地址并ping到那些IP服务器以检查它们是不是还活着

获取远程主机的日志文件中的特定信息字段并保存在本地

JAVA获取IP地址

仅从 CoreDate 或所有内容中获取所需的数据?

Python复用脚本根据excel表格的IP和资产归属部门,保存docx文件到部门目录

Python复用脚本根据excel表格的IP和资产归属部门,保存docx文件到部门目录