仅从日志文件中获取 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您可以从 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服务器以检查它们是不是还活着