我已将此输出写入文本文件:
DataStore_Checksum.txt:65:esentutl : ERROR: page 3401 checksum failed
DataStore_Checksum.txt:69: + CategoryInfo : NotSpecified: (ERROR: page 3401 checksum failed:String) [], RemoteException
DataStore_Checksum.txt:73:ERROR: page 6131 checksum failed
DataStore_Checksum.txt:74:ERROR: page 6357 checksum failed
我需要存储每个校验和失败的页码。在这种情况下,[3401, 6131, 6357]
。
我尝试使用两种方法:
ToString().Split(' ')[2]
'\d pattern matches
但是页码的行内容位置在每一行上都不同。出于某种原因,\d
语法不适用于Select-String
或-Split
。
有什么想法吗?
答案 0 :(得分:0)
模式\d
是一种语法有效的正则表达式,可以与Select-String
一起使用,但是由于所需的数字始终被相同的文本模式包围,即:
ERROR: page #NUMBER# checksum failed
您最好使用Select-String
来捕获上下文中所有连续数字 :
$pageNumbers = Select-String 'ERROR: page (\d+) checksum failed' -Path .\file.txt -AllMatches |ForEach-Object {
# grab the (\d+) capture group
$_.Match.Groups[1].Value
} |Sort-Object -Unique # filter out duplicates
答案 1 :(得分:0)
假设可以将整个输入文件加载到内存中,以更简洁的方式补充Mathias R. Jessen's helpful answer:
[regex]::Matches((Get-Content -Raw file.txt), '(?<=\bERROR: page )\d+').Value
[regex]::Matches()
在指定正则表达式的输入字符串中查找所有匹配项。
负向后断言(?<=\bERROR: page )
查找字符串ERROR: page
而不在每个匹配项中包含它,因此匹配项仅包含页码(\d+
)。
在所有匹配项上访问.Value
属性,然后仅返回页码数组(作为字符串)。
上面的代码会产生一个常规的PowerShell数组([object[]]
),其中包含所有页码:
3401
3401
6131
6357
如果需要消除重复项:
如果重复项总是分组在一起,请将上述命令通过管道传递到| Get-Unique
如果未将它们分组 ,则通过管道传递到| Select-Object -Unique
。
如果要在排除重复的情况下按页码进行排序,请像Mathias的回答一样,将其输送到
| Sort-Object -Unique
。