2017-02-27 10 views
0

我有可能包含以下列格式多達1000行的數據的文本文件:搜索首先在線路字符「X」的量,並輸出整行

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,這將有助於嗎?

我已經嘗試了各種在線搜索(並通過微軟在線資源),但很多結果更多的是與「返回第一個X數量的字符」,而不是「只使用第一個X數量進行搜索並返回行」

親切的問候

+0

@wOxxOm - 求卜者不指定該模式將總是從字符串的開始;只有它會在前7個字符內出現。 –

+1

我認爲querent需要提供一個更好的例子,說明他正在尋找什麼以及他期望看到的結果。 –

+0

@wOxxOm謝謝,我會給你一個去吧:) – Nighthawkz

回答

2

你可以使用一個簡單的過濾器Where-Object檢查:前的字符串是否是你所期望的字符串之一:

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

這可能是MOS t 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)以匹配字符串中的任何一個,在一個字符串的開頭^,隨後:

兩種解決方案都將與字符串任意數量的工作

+0

「Where-Object」解決方案似乎與Querent的意圖相符;使用'-split'和數組下標是一個非常好的和優雅的方式。 –

+0

@ MathiasR.Jessen感謝您的支持!我遇到了一個問題。即使我嘗試搜索我知道存在的一條線,它也不會拉回任何東西。嘗試兩種方式。它在ISE窗口中看到,它看起來像是通過每行看起來像這樣:_C:\ Users \ LCIAV \ Desktop \ acsepto22 \ acsmrk-20170222_230159.done:4744:1645614 | EU005936547 | _(我不知道它會包括搜索條件中的路徑)我的問題變化完全出現我並沒有在開始時尋找某些東西,而是在中途和**:**和** | **之間。謝謝你的迴應,它確實回答我的(不正確!)問題 – Nighthawkz

+0

如果你使用第二種方法,'Select-String'將返回一個'MatchInfo'對象 - 如果你只想要字符串本身,就抓住'Line '屬性(將更新答案) –

相關問題