我打這個磚牆。我的任務是在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,這對我來說完全沒用。