2014-04-01 22 views
0

我試圖解析這種格式的文本文件:解析文本使用PowerShell和只顯示你正在尋找

\\fileshare40\abccheck\logons\ABC64ZXZ.txt:5398:UserID: abcusernamehere Logged: 09:18:36 2014/03/13 
\\fileshare40\abccheck\logons\ABC63BZB.txt:5403:UserID: abcusernamehere Logged: 01:21:31 2014/03/14 
\\fileshare40\abccheck\logons\ABC61ZSF.txt:5408:UserID: abcusernamehere Logged: 08:22:31 2014/03/17 
\\fileshare40\abccheck\logons\ABC62ETB.txt:5413:UserID: abcusernamehere Logged: 07:58:52 2014/03/18 
\\fileshare40\abccheck\logons\ABC60BBB.txt:5418:UserID: abcusernamehere Logged: 13:11:36 2014/03/19 

我需要離開這裏的唯一事情是機器名(ABC * ****)。稍後我會把它放入一個數組中,看看是否有重複,但這裏的答案會讓我開始在這條路上。

我已經試過這樣:

$abc = select-string -path c:\users\abcusernamehere\desktop\findusermachines.txt -pattern "TCWS....." -allmatches 

但這樣做會顯示在該文件中的文本的整條生產線。我該如何分解線路才能找到並顯示我正在搜索的內容?

回答

1

對於這一點,你可以使用正則表達式:

(get-content c:\users\abcusernamehere\desktop\findusermachines.txt) -replace '.+\\(.+?)\.txt:.+','$1' 

ABC64ZXZ 
ABC63BZB 
ABC61ZSF 
ABC62ETB 
ABC60BBB 

有真的在使用選擇 - 要搜索的字符串有服務器名稱,如果他們都有一個行沒有任何意義。只需使用Get-Content,並針對所有行運行-replace運算符。

+0

謝謝先生。你有沒有機會知道如何擺脫頂部的空白? –

+0

我在那裏放置空行以將腳本從輸出中分離出來。這實際上並不是結果的一部分。 – mjolinor

0

你可以用正則表達式匹配。

[regex]::Matches((gc c:\users\abcusernamehere\desktop\findusermachines.txt),"ABC.....")|select -ExpandProperty value 

這回吐出:

ABC64ZXZ 
ABC63BZB 
ABC61ZSF 
ABC62ETB 
ABC60BBB 
0

還有一個對方的回答:-)

${c:\users\abcusernamehere\desktop\findusermachines.txt } | ? { $_ -cmatch "\b(?<MACHINE>ABC.+)\b.txt" } | % { $Matches['MACHINE'] } 

ABC64ZXZ
ABC63BZB
ABC61ZSF
ABC62ETB
ABC60BBB