如何解决解析日志文件,匹配字符串数组
我有一个非常大的 DNS 调试日志,其中每一行都包含一个 IP 和一个记录类型(SOA、A、PTR),以空格分隔。 一个例子:
SND 2.2.2.2 SOA
SND 2.2.2.2 A
RCV 11.11.11.11 A
RCV 4.4.4.4 SOA
RCV 7.7.7.7 SOA
我想过滤掉包含单词 SOA 或 $IgnoreIPs 字符串数组中的任何值的任何行。我该怎么做?
$LogFilePath = (Get-content "c:\DNS Debug.log" )
$IgnoreIps= "1.1.1.1","2.2.2.2","3.3.3.3","4.4.4.4"
foreach ($Line in $LogFilePath){
if (($Line -match "Rcv") -and ($line -notmatch "SOA") -and ($line -notmatch $IgnoreIps)){
write-host "do stuff"
}
}
解决方法
您可以更轻松地将每一行解析为单独有意义的组件:
foreach($line in $LogFilePath){
# Split into three parts,trim any trailing whitespace
$direction,$address,$rtype = $Line -split '\s+',3 |% Trim
if($address -in $IgnoreIps){
# ignored IP,skip this line
continue
}
if($rtype -eq 'SOA'){
# SOA record,skip this line
continue
}
if($direction -eq 'Rcv'){
# Neither address nor resource type is ignored,let's do the work!
Write-Host "do stuff"
}
}
,
更新 - 不是最优雅的,但我最终这样做了: 不是最优雅的方法,但这有效(notin 运算符):
foreach ($Line in $LogFilePath){
if ( ($Line -match "Rcv") -and !(($Line -match 'SOA') -or ($Line -match 'TKEY')) ){
$IPAddress = ($Line| Select-String -Pattern "\d{1,3}(\.\d{1,3}){3}" -AllMatches).Matches.Value
If($IPAddress -notin $IgnoreIps){
write-host "do stuff"
}
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。