【发布时间】: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