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

时间:2016-10-25 06:42:38

标签: c# sql sql-server regex csv

仅从日志文件中获取IP地址并保存到文件,表格或.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 addreses的db,csv或text文件中。

这样的事情:

"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日开始然后抓住所有东西,直到我到达一个空间?

在我抓住它们之后,我将对它们进行计数和排序并将它们保存为最终格式。

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

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

我需要解析这个日志文件,这是需要发生的事情;这很疯狂:

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

2。)代码只计算通过用于HTTP的标准端口发出的GET请求,并且应该从计数中排除从' 207.114'开始的所有IP请求。

  1. )应订购最终的CSV文件,以便首先列出请求次数最多的IP。

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

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

  4. 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"

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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语句)

答案 2 :(得分:0)

添加名称空间,

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/