仅从日志文件中获取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请求。
)应订购最终的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"
答案 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/