我打这个砖墙。我的任务是在Windows服务器列表中搜索IIS日志,并创建一个包含连接到日志文件中服务器的所有IP地址的报告。如果我使用Linux,那很容易。我可以使用grep并在几分钟内完成剪切。但是,这些是内部服务器,我无法通过BASH shell访问它们。我需要创建一个脚本,并使用PowerShell在本地运行它。如何搜索IP地址的多个文本文件并使用PowerShell输出发现的文本文件的IP地址?
就像我已经能够得到的是,首先运行一个脚本,该脚本搜索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
这产生含有在它的一个IP地址的每个日志线CSV文件。然后,我对运行该文件,以查找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,这对我来说完全没用。