首先搜索" x"一行中的字符数量,并输出整行

时间:2017-02-27 12:34:29

标签: powershell powershell-v2.0

我有一个文本文件,最多可包含以下格式的1000行数据:

14410:3012669|EU14410|20/01/2017||||1|6|4|OUT FROM UNDER||22/02/2017 04:01:47|22/02/2017 21:19:52
14:3012670|EU016271751|20/01/2017||||2|6|4|BLOCK BET|\\acis-prod\Pictures\Entry\EU01627.jpg|22/02/2017 04:02:02|22/02/2017 21:19:52
301111:3012671|EU016275|20/01/2017||||2|6|4|VITAE MEDICAL CLINIC|\\tm-prod\Pictures\Entry\EU01.jpg|22/02/2017 04:02:11|22/02/2017 21:19:53

每一行将以以下格式开头

"set of characters up to max of 8":"set of characters unlimited max"

我想在第一次冒号之前搜索字符。这些字符可以包含任何数量,最多可以包含8个。(希望在上面的示例中很好地显示)我试图搜索那些第一个字符,直到":"每行查看它是否包含一个字符串,并返回整行。对PowerShell来说还是新手,所以我只尝试了一个简单的选择:

$path = "C:\Users\ME\Desktop\acsep22\acsnic-20170222_233324.done"
Get-ChildItem $path -recurse | Select-String -pattern ("14410","3011981","3011982",) | out-file $logfile |format-list 

有效 - 但我没有考虑到该字符串也可能在同一行中出现两次(虽然与前7个字符无关)

例如:

14410:3012669|EU14410|

包含14410两次,它们的重要性无关,我只想根据第一个数字进行搜索和返回

有人可以帮助我实现这个目标,还是有人能指出我会对cmdlet有所帮助?

我已尝试在线进行各种搜索(并通过Microsoft在线资源),但很多结果更多地与"返回第一个X字符数量"而不是"只使用第一个X金额和返回行"

进行搜索

亲切的问候

1 个答案:

答案 0 :(得分:2)

您可以使用简单的Where-Object过滤器来检查:之前的字符串是否是您期望的字符串之一:

$strings = '14410','3011981','3011982'
Get-Content $path |Where-Object {$strings -contains ($_ -split ':')[0]}

这可能是PowerShell最惯用的方法。

如果你想使用Select-String,你必须构建一个正则表达式模式,该模式将匹配以其中一个字符串开头然后冒号的字符串:

$strings = '14410','3011981','3011982'
$pattern = '^(?:{0}):' -f ($strings -join '|') # pattern is now '^(?:14410|3011981|3011982):' 
Select-String -Path $path -Pattern $pattern 

如果您只想从输出中获取裸字符串本身,请从Line返回的对象中获取Select-String属性:

Select-String -Path $path -Pattern $pattern |Select-Object -Expand Line

Select-String -Path $path -Pattern $pattern |ForEach-Object Line

上面的模式使用非捕获组(?:pattern-goes-here)来匹配字符串的开头^中的任何一个字符串,然后是:

两种解决方案都可以使用任意数量的字符串