使用“选择字符串”从txt文件中提取括号中的所有事件标题



我正试图提取其中一个日志中事件的标题,该日志只是一个包含大量数据的文本文件。文件名为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)

相关内容

  • 没有找到相关文章

最新更新