我正在使用foreach循环搜索大量的日志,寻找一个字符串($text),并将整行输出到输出文件($logfile)Get-ChildItem "\\$server\$Path" -Filter "*.log" |select-string -pattern $text |select -expandproperty line |out-file $logfile -append
其中一个日志文件的示例行可能如下所示May 25 04:08:36.640 2016 AUDITOF GUID 1312.2657.11075.54819.13021094807.198 opened by USER
其中$text = "opened by USER"
所有这些都工作得很好,它吐出了每个日志文件的每一行,其中包括$text,这很棒。
但是..我想我想做的是得到日期时间和GUID的输出。Guid可以更改格式、长度等,但它将始终包含点,并且始终跟在GUID (space)
之后,在(space) opened
之前
简而言之,我尝试使用lookbehind(或lookforward)或match来执行正则表达式,这将向$logfile返回类似下面的内容
2016年5月25日04:08:36.640,1312.2657.11075.54819.13021094807.198
任何帮助感激不尽。我对正则表达式很反感。
2条答案
按热度按时间lrl1mhuk1#
一种方法就是这样做
说明:
-SimpleMatch
添加到Select-String
cmdlet中,因为您似乎希望完全匹配$text
,并且由于它在那里不使用regex,因此这将是最佳选择。Select-Object -ExpandProperty Line
可以返回一个匹配行的数组,因此我将其通过管道传递给ForEach-Object
,以循环通过该数组if (..)
使用正则表达式-match
,如果该条件为$true,则执行大括号内的任何操作。此外,这个测试(如果$true)会自动设置一个$matches对象数组,我们使用这些匹配输出一个逗号分隔的行,然后将其收集到变量$result中。
Regex详细信息:
alen0pnh2#
使用Pattern属性过滤文件内容