【问题标题】:how to search multiple text files for IP addresses and output the IP addresses found to a text file using powershell?如何在多个文本文件中搜索 IP 地址并将找到的 IP 地址输出到使用 powershell 的文本文件中?
【发布时间】:2016-08-18 12:37:23
【问题描述】:

我用这个碰了一堵砖墙。我的任务是在 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 地址开头,所以我最终得到的是 192.168.1.X 的大约 130,000 行,这对我来说完全没用。

【问题讨论】:

    标签: csv powershell ipv4


    【解决方案1】:

    如果我使用的是 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"
    

    【讨论】:

      【解决方案2】:

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

      您可以使用下面的代码让 IP 到达您的网站。只需选择日志文件名,或者如果您想分析多个日志文件,只需使用通配符,如“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 多个有用的示例!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-26
        • 1970-01-01
        • 2012-12-01
        • 2015-06-22
        • 2012-03-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多