我有一个问题,我真的希望得到一些帮助。 它相当复杂但我会尽量让我的解释尽可能简单和客观。简而言之,我有包含数千行的日志文件。每行包含日期/时间,来源,类型和消息等信息。 在这种情况下,消息包含我需要屏蔽的可变大小... 999密码。基本上,消息看起来像这样(它是一个ISO消息):
今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555 008PASSWORD 6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff
对于每一行,我需要对密码长度标识符(008)进行归零,对其进行计数,然后继续掩盖后续字符的数量,在这种情况下将是PASSWORD。我会把它改成类似XXXXXXXX的东西,所以一旦完成线就会是这样的:
今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555 008XXXXXXXX 6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff
老实说,我不知道如何使用PowerShell开始这样做。我需要遍历日志文件中的每一行,并确定要屏蔽的字符数。
我一直把这个高级别作为一个起点,我希望稍后能解决一些其他的复杂问题,比如有不同类型的消息并且取决于密码的类型长度从另一个角色位置开始。我可能首先能够建立我前面提到的问题,但如果有人理解我的意思,那么我也会感谢一些帮助或提示。
感谢任何帮助。
谢谢!
原始帖子的其他信息:
首先,感谢大家为您提供的答案,我们非常感谢。现在我根据我的信息制定了答案的基线,我觉得我需要提供更多细节。
1)有一个问题是密码起始位置是否固定及其背后的逻辑。
2)这就是我所知道的,这些是我希望用脚本完成的步骤。
我所知道的: - 有3种不同的msg类型包含密码。我已经根据位图和存在的数据元素找出了每个msg类型的密码起始位置。 例如,0210在这种情况下包含一个:
今年日 - 月00:00:00,计算机名称,来源,资讯,RX 0210 22222222222222333333333333333333444444444444444444444444455555008PASSWORD6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff
我需要做什么:
答案 0 :(得分:1)
看起来好像您指示了密码的位置,密码的长度会有所不同。只要你有'008'和#666; 666'表示这样的开始和停止点应该起作用。
$filePath = '.\YourFile.log'
(Get-Content $filePath) | ForEach-Object {
$startIndex = $_.IndexOf('008') + 3
$endIndex = $_.IndexOf('666', $startIndex)
$passwordLength = $endIndex - $startIndex
$passwordToReplace = $_.Substring($startIndex,$passwordLength)
$obfuscation = New-Object 'string' -ArgumentList 'X', $passwordLength
$_.Replace($passwordToReplace, $obfuscation)
} | Set-Content $filePath
如果文件太大而无法加载到内存中,则必须StreamReader
和StreamWriter
将内容写入新文件并删除旧文件。
答案 1 :(得分:0)
假设密码长度字段开始的固定位置,根据您的样本行(如果该位置是可变的,正如您所暗示的那样,您需要告诉我们更多信息) :
$line = '22222222222222333333333333333333444444444444444444444444455555008PASSWORD6666666666666666677777777777777777777777ccccdddddddddddffffffffffffff'
$posStart = 62 # fixed 0-based pos. where length-of-password field stats
$pwLenFieldLen = 3 # length of length-of-password field
$pwLen = [int] $line.SubString($posStart, $pwLenFieldLen) # extract password length
$pwSubstitute = 'X' * $pwLen # determine the password replacement string
# replace the password with all Xs
$line -replace "(?<=^.{$($posStart + $pwLenFieldLen)}).{$pwLen}(?=.*)", $pwSubstitute
注意:这不是最有效的方法,但它很简洁。