我正在用这个打砖墙。我的任务是在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,这对我来说完全没用。
答案 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)