如何搜索多个文本文件的IP地址,并使用PowerShell输出找到文本文件的IP地址?

时间:2016-08-17 22:18:14

标签: csv powershell ipv4

我正在用这个打砖墙。我的任务是在Windows服务器列表中搜索IIS日志,并在日志文件中创建连接到服务器的所有IP地址的报告。如果我使用Linux,那将很容易。我可以使用grep和cut并在几分钟内完成。但是,这些是内部服务器,我无法从BASH shell访问它们。我需要创建一个脚本并使用PowerShell在本地每台服务器上运行它。

我能够得到的就是首先运行一个脚本来搜索C:\ inetpub \ logs \ LogFiles \中的所有.log文件,查找看起来像IPV4地址的所有内容并将其转储到CSV文件

get-childItem C:\inetpub\logs\logfiles\ -include *.log -rec | select-String -pattern ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’ | select-Object -Propery 'Line' | export-CSV C:\temp\output.txt -notypeinformation

创建一个包含每个日志行的csv文件,其中包含IP地址。然后我针对该文件运行第二个脚本,该文件查找IP地址并将它们输出到另一个文件(不可否认地从某个地方“借来”)

$FilesOfInterest = (
    "*.csv"
)

$pattern = ‘\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b’

function FindFilesWithContent($Root, $Include, $Pattern){
    try{
        Get-ChildItem -Path:$Root -Include:$Include `
            -Recurse -Force -ErrorAction:SilentlyContinue |
            ?{!$_.PSIsContainer} |
        ForEach-Object{
            Write-Progress $_.FullName;
            $item = $_;
            Get-Content $_ -ErrorAction SilentlyContinue |
            ForEach-Object {
                if($_ -match $Pattern){
                    "" | select filename,match | %{
                        $_.filename = $item.FullName;
                        $_.match = $matches[0];
                        return $_ 
                    }
                }

            }
        }
    }
    catch{
    }
}


FindFilesWithContent -Root C:\temp -Include $FilesOfInterest -Pattern $pattern |export-csv C:\temp\filtered.csv
我遇到的问题是,一旦找到IP地址,它就会跳到下一行。日志文件的每一行都以时间戳和服务器本身的IP地址开头,所以我最终得到的是大约130,000行192.168.1.X,这对我来说完全没用。

2 个答案:

答案 0 :(得分:0)

  

如果我使用Linux,那将很容易。我可以使用grep和cut并在几分钟内完成。但是,这些是内部服务器,我无法从BASH shell访问它们。

在Windows上,有效查询IIS日志文件的最可行方法是使用Microsoft's LogParser utility

LogParser支持类似SQL的查询,以获取日志中所有客户端IP地址的列表:

logparser "SELECT DISTINCT c-ip INTO C:\clientips.txt FROM C:\inetpub\logs\logfiles\*.log"

答案 1 :(得分:0)

为了分析IIS日志,我强烈建议您使用Logparser。 一种易于使用的命令行工具,它使用SQL方言从数据源中提取信息。

您可以使用以下代码获取到达您网站的IP。只需选择logfilename,或者如果要分析多个日志文件,只需使用通配符,如" c:/ logs / ex *"

logparser "select c-ip, count(c-ip) as requestcount from [LogFileName] group by c-ip order by count(c-ip) desc"

如果你不是SQL的忠实拥趸,那么有人写了This超过50个有用的例子!