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

search first "x" amount of characters in a line, and output entire line

我有一个最多可包含 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 个字符。(希望在我上面的示例中显示得很好)我正在尝试搜索那些第一个字符,直到每行的“:”以查看它是否包含一个字符串,并且return整行。 powershell 还是新手,所以我只尝试了一个简单的 select:

$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,它们在重要性方面无关,我只想搜索 return 根据第一个数字

有人可以帮助我实现这一点,或者有人可以向我指出可以提供帮助的 cmdlet 吗?

我尝试了各种在线搜索(以及通过 Microsoft 在线资源),但很多结果与 "return the first X amount of characters" 而不是 "search using only the first X amount and return line"

有关

亲切的问候

您可以使用一个简单的 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 

如果您只想从输出中获取裸字符串本身,请从 Select-String:

返回的对象中获取 Line 属性
Select-String -Path $path -Pattern $pattern |Select-Object -Expand Line

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

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

两种解决方案都适用于任意数量的字符串