只从日志文件中获取IP地址,然后保存到文件、表或.CSV

本文关键字:然后 存到文件 CSV 表或 地址 日志 文件 IP 获取 | 更新日期: 2023-09-27 18:14:41

只从日志文件中获取IP地址并保存到file、Table或.CSV

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

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地址,并将其保存为数据库中的一行或一行。我可能会先保存到List或类似的文件中,然后保存到只包含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发出的请求。

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

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

  3. )第一列应包含请求数,第二列将包含发出请求的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">

只从日志文件中获取IP地址,然后保存到文件、表或.CSV

您可以从金块安装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

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,如果没有匹配的内容,它将继续while循环(根据if语句(

添加命名空间

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/