我正试图提取其中一个日志中事件的标题,该日志只是一个包含大量数据的文本文件。文件名为eventlog-1-5-2016.txt
(日期始终为当前日期)。文件中的每一行都是这样的一个事件:
1-1-16(海军准将集会)地址|时间1-2-16(开放日)地址|时间
我只想浏览该文件,提取括号中的标题,不包括括号本身,并将列表输出到控制台或文本文件。
我也尝试过输出到一个txt文件,但是我缺少一些东西。你能告诉我为什么这不起作用吗:
控制台:
Select-String -Path c:logeventlog-1-5-2016.txt -Pattern '(([^)]+))' -AllMatches |
% { $_.Matches }
至文件:
Select-string -Path c:logeventlog-1-5-2016.txt -Pattern '(([^)]+))' -AllMatches |
% { $_.Matches } | { $_.Value > C:logresults.txt
如果这是错误的,甚至是更好的方法。
额外的问题是,路径是否可以自动计算当前日期并更正文件名,以便将来粘贴?(不是主要的!)
当前日期可以这样确定:
(Get-Date).ToString('d-M-yyyy')
此外,您的正则表达式可以通过使用非贪婪匹配来简化一点:
`((.+?))
如果你只想要括号之间的文本,你需要捕获组的值,而不是完全匹配:
$date = (Get-Date).ToString('d-M-yyyy')
Select-String -Path "C:logeventlog-$date.txt" -Pattern '((.+?))' -AllMatches |
ForEach-Object { $_.Matches } |
ForEach-Object { $_.Groups[1] } |
ForEach-Object { $_.Value } |
Out-File 'C:logresults.txt'
如果你有PowerShell v3或更新版本,你可以折叠ForEach-Object
语句:
Select-String -Path "C:logeventlog-$date.txt" -Pattern '((.+?))' -AllMatches |
ForEach-Object { $_.Matches.Groups[1].Value } |
Out-File 'C:logresults.txt'
或者您可以使用-match
运算符:
Get-Content "C:logeventlog-$date.txt" |
Where-Object { $_ -match '((.+?))' } |
ForEach-Object { $matches[1] } |
Set-Content 'C:logresults.txt'
发生的情况是Select-String
并没有完全做到你认为的那样。它将匹配模式,但不会返回匹配的部分,而是返回整个匹配字符串。因此,该语句将返回整个匹配的行,而不仅仅是括号中的子字符串。这是造成混乱的常见原因。
作为链路腐烂的一个简单例子,
[regex]$rx = '(([^)]+))'
cat C:Templogfile.txt | % { $rx.Matches( $_ ).value }
(Commodore Rally)
(Open House)