使用powershell解析文本并仅显示您要搜索的内容

时间:2014-04-01 20:20:07

标签: parsing powershell text pattern-matching select-string

我尝试使用以下格式解析文本文件:

\\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

但这样做会显示该文件中的整行文字。如何分解线条以找到并显示我正在搜索的内容?

3 个答案:

答案 0 :(得分:1)

为此,您可以使用正则表达式:

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

ABC64ZXZ
ABC63BZB
ABC61ZSF
ABC62ETB
ABC60BBB

使用Select-String搜索具有服务器名称的行(如果它们都有一行)真的没有意义。只需使用Get-Content,并对所有行运行-replace运算符。

答案 1 :(得分:0)

你可以用正则表达式匹配来做到这一点。

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

吐了回来:

ABC64ZXZ
ABC63BZB
ABC61ZSF
ABC62ETB
ABC60BBB

答案 2 :(得分:0)

还有一个答案:-)

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

ABC64ZXZ
ABC63BZB
ABC61ZSF
ABC62ETB
ABC60BBB