2014-07-08 94 views
0

我正在寻找使用powershell从文本块中恢复主机名。该块如下:从文本块中提取单个字

The computer attempted to validate the credentials for an account. 
Authentication Package: MICROSOFT_AUTHENTICATION_PACKAGE_V1_0 
Logon Account: svc.sXXX.d.fdb 
Source Workstation: DIXXXEF01 
Error Code: 0x0 

正如你可以看到它的一个多行文本块。目前我正试图减少5安全日志的绒毛。我希望使用powershell regrex命令或类似的东西来恢复登录帐户和源工作站。

任何想法?谢谢。

ISJ

+0

试试这个: $ account ='登录帐号:' $ workstation ='源工作站:' $ textBlock | Where-Object {$ _ -like“$ account *” - 或$ _ -like“$ workstation *”} | Foreach-Object IF($ _ -like“$ account *”){$ _。Trim($ account)}; IF($ _ -like“$ workstation *”){$ _Trim($ workstation)} } 不知道它会工作,由于大小(5GB),可能需要使用流或什么,我没有我害怕Powershell的这种体验。如果它起作用,它会看起来像这样: svc.sXXX.d.fdb DIXXXEF01 –

回答

0

Get-ContentSelect-String

get-content logfile.txt | select-string '^Logon Account|^Source workstation' 

^字符的装置 '线的开始'。有关更多信息,请参阅PowerShell帮助主题about_Regular_Expressions

+0

你真的可以用get-content处理这些数据量吗?我经历过,如果你不能在记事本中打开它(你不能),你不能使用get-content。我想他可能需要使用Streamreader或其他东西。但我想他可以改变尝试:)如果它不工作,他可以​​修改它与Streamreader一起工作,否则将工作。 –

+0

您可以使用'-ReadCount'参数来更改'Get-Content'的缓冲区大小。这对于大量输入可能会产生重大影响。 –

+0

我试过了($ feResult.Message -replace“\ n”| Select-String -Pattern'Account:。\ w'),但它仍然只是返回整个字符串而不是“Account:”后的单词。 –

1

使用获取内容与-ReadCount和-match和借用比尔的正则表达式):

Get-Content $file -ReadCount 1000 | 
foreach { $_ -match '^Logon Account|^Source workstation' } | 
Add-Content $newfile 

您可以调整,通过改变-ReadCount参数。通常1000-5000的计数产生最佳结果。

您也可以使用Select-String,但它会返回MatchInfo对象,其中包含许多其他数据,您不需要此应用程序。如果你确实需要它,这真是太好了,但是它与Select-String一样应用相同的正则表达式大约需要4倍的时间,正如它与-match一样,并且如果你所需要的只是字符串,那么Select-String就是矫枉过正。 (恕我直言)