逐行解析列表,在Powershell中创建一个新列表

yod*_*ish 1 powershell

我需要读取包含源/目标IP和端口以及标记的文件.我正在使用Get-Content:

Get-Content $logFile -ReadCount 1 | % {

} | sort | get-unique | Out-File "C:\Log\logout.txt"
Run Code Online (Sandbox Code Playgroud)

这是输入文件的示例:

|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|
Run Code Online (Sandbox Code Playgroud)

我需要做的是输出一个新的列表,但如果相同的源/目标IP /端口都是'垃圾邮件'和'机器人',我只需要将该行输出为'机器人'(上面第1行和第2行).如果现有连接的反方向是"垃圾邮件"或"机器人",我需要做同样的事情,我只需要一个或另一个,它就是'机器人'(上面的第3和第4行).将有大量"垃圾邮件"行没有重复或反向连接(上面的最后几行),他们需要保持不变.

这是我一直用来创建连接的反向方向,但我还没弄清楚如何正确创建新列表:

$reverse = '|' + ($_.Split("|")[3,4,1,2,5] -join '|') + '|'
Run Code Online (Sandbox Code Playgroud)

上述产出将是:

|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|
Run Code Online (Sandbox Code Playgroud)

(除了第二行不必是相反的方向)

谢谢你的帮助!

wOx*_*xOm 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)
Run Code Online (Sandbox Code Playgroud)