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

时间:2017-07-07 14:59:35

标签: powershell

我需要读取包含源/目标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|

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

感谢您的帮助!

1 个答案:

答案 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)