我需要读取包含源/目标IP和端口行以及标记的文件。我正在使用Get-Content:
Get-Content $logFile -ReadCount 1 | % {
} | sort | get-unique | Out-File "C:\Log\logout.txt"
这是输入文件的示例:
|10.0.0.99|345|195.168.4.82|58164|spam|
|10.0.0.99|345|195.168.4.82|58164|robot|
|10.0.0.99|231|195.168.4.82|58162|spam|
|195.168.4.82|58162|10.0.0.99|231|robot|
|10.0.0.99|345|195.168.4.82|58168|spam|
|10.0.0.99|345|195.168.4.82|58169|spam|
我需要做的是输出一个新列表,但如果相同的源/目标IP /端口都是垃圾邮件'和#机器人'我只需要输出那条线作为机器人' (上面的第1和第2行)。 如果现有连接的反方向是“垃圾邮件”,我需要做同样的事情。或者'机器人',我只需要一个或另一个,它将是机器人' (上面的第3和第4行)。会有很多“垃圾邮件”和“垃圾邮件”。没有重复或反向连接的线(上面的最后几行),它们需要保持不变。
这就是我用来创建连接反向的方法,但我还没有弄清楚如何正确创建新列表:
$reverse = '|' + ($_.Split("|")[3,4,1,2,5] -join '|') + '|'
上述输出将是:
|10.0.0.99|345|195.168.4.82|58164|robot|
|195.168.4.82|58162|10.0.0.99|231|robot|
|10.0.0.99|345|195.168.4.82|58168|spam|
|10.0.0.99|345|195.168.4.82|58169|spam|
(除了第二行不必反方向)
感谢您的帮助!
答案 0 :(得分:5)
由于检查了直接和反向连接,并且它们的行顺序可能不是顺序的,我会使用哈希表来存储两个方向的类型并按算法执行所有操作:
$checkPoints = @{}
$output = [ordered]@{}
$reader = [IO.StreamReader]'R:\1.txt'
while (!$reader.EndOfStream) {
$line = $reader.ReadLine()
$s = $line.split('|')
$direct = [string]::Join('|', $s[1..4])
$reverse = [string]::Join('|', ($s[3,4,1,2]))
$type = $s[5]
$known = $checkPoints[$direct]
if (!$known -or ($type -eq 'robot' -and $known -eq 'spam')) {
$checkPoints[$direct] = $checkPoints[$reverse] = $type
$output[$direct] = $line
$output.Remove($reverse)
} elseif ($type -eq 'spam' -and $known -eq 'robot') {
$output.Remove($reverse)
}
}
$reader.Close()
Set-Content r:\2.txt -Encoding utf8 -value @($output.Values)