只从日志文件中获取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发出的请求。
)应该对最终的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">
您可以从金块安装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/