我使用powershell的select-string,它工作得很好,但有时我不喜欢它给我匹配的整行,因为它包含(对我来说)不必要的信息。
是否有简单的方法让它给我只是10个字符之前,regex, regex和15个字符之后?我现在使用它的例子:
gci *.log | select-string "lastname"
使regexp为(.{10})lastname(.{15})
,并使用Where-Object
与-match
运算符代替Select-String
:
gci *.log | ? { $_ -match '(.{10})lastname(.{15})' } | % {
"{0}`t{1}" -f ($matches[1], $matches[2])
}
你需要使用组,你可以像这样使用命名组:
gci c:temp_sotemp*.log |
select-string -Pattern "(?<refvalue>lastname)" |
select -expand Matches |
foreach {$_.groups["refvalue"].value}
请记住,您总是将管道对象获取到Get-Member
以查看属性。
PS C:> $text = 'asdfqwerasdfqwerlastnameasdfqwerasdfqwerasdf'
PS C:> $text | Select-String -Pattern 'lastname' | Get-Member
Name MemberType Definition
---- ---------- ----------
...
Matches Property System.Text.RegularExpressions.Match[] Matches {get;set;}
PS C:> ($text | Select-String -Pattern 'lastname').Matches
Groups : {lastname}
Success : True
Captures : {lastname}
Index : 16
Length : 8
Value : lastname
PS C:> $index = ($text | Select-String -Pattern 'lastname').Matches.Index
PS C:> $text[($index-10)..($index+15)] -join ''
erasdfqwerlastnameasdfqwer