0

我正在尝试在我的一个日志中提取事件的标题,这只是一个包含大量数据的文本文件。文件名是eventlog-1-5-2016.txt(日期始终是当前日期)。文件中的每一行都是一个事件,如下所示:

1-1-16(Commodore Rally)地址|时间
1-2-16(Open House)地址|时间

我只想浏览文件并提取括号中的标题,不包括括号本身,并将列表输出到控制台或文本文件。

我也尝试过输出到 txt 文件,但我遗漏了一些东西。你能告诉我为什么这不起作用:

安慰:

Select-String -Path c:\log\eventlog-1-5-2016.txt -Pattern '\(([^\)]+)\)' -AllMatches |
  % { $_.Matches }

归档:

Select-string -Path c:\log\eventlog-1-5-2016.txt -Pattern '\(([^\)]+)\)' -AllMatches |
  % { $_.Matches } | { $_.Value > C:\log\results.txt

如果这是错误的,甚至是更好的方法。

额外的问题,路径可以自动计算当前日期并更正文件名以便将来粘贴吗?(不是主要的!)

4

2 回答 2

0

发生的情况是,它Select-String并没有完全按照你的想法做。它将匹配模式,但不是返回匹配的部分,而是返回整个匹配的字符串。因此,该语句返回整个匹配的行,而不仅仅是括号中的子字符串。这是常见的一个令人困惑的原因。

作为链接腐烂的一个简单示例,

[regex]$rx = '\(([^\)]+)\)'
cat C:\Temp\logfile.txt | % { $rx.Matches( $_ ).value }
(Commodore Rally)
(Open House)
于 2016-01-13T11:32:40.300 回答
0

当前日期可以这样确定:

(Get-Date).ToString('d-M-yyyy')

此外,您的正则表达式可以通过使用非贪婪匹配来简化一点:

`\((.+?)\)

如果您只需要括号之间的文本,则需要捕获组的值而不是完全匹配:

$date = (Get-Date).ToString('d-M-yyyy')
Select-String -Path "C:\log\eventlog-$date.txt" -Pattern '\((.+?)\)' -AllMatches |
  ForEach-Object { $_.Matches } |
  ForEach-Object { $_.Groups[1] } |
  ForEach-Object { $_.Value } |
  Out-File 'C:\log\results.txt'

如果您有 PowerShell v3 或更新版本,您可以折叠ForEach-Object语句:

Select-String -Path "C:\log\eventlog-$date.txt" -Pattern '\((.+?)\)' -AllMatches |
  ForEach-Object { $_.Matches.Groups[1].Value } |
  Out-File 'C:\log\results.txt'

或者您可以使用-match运算符:

Get-Content "C:\log\eventlog-$date.txt" |
  Where-Object { $_ -match '\((.+?)\)' } |
  ForEach-Object { $matches[1] } |
  Set-Content 'C:\log\results.txt'
于 2016-01-13T16:34:59.017 回答