4

IISログで特定の文字列をselect-string検索し、上の2行と下の1行を返すがあります。

結果は次のようになります。

2012-06-15 18:26:09 98.138.206.39 OutboundConnectionResponse SMTPSVC1 WEB10 - 25 - - 220+mta1083.sbc.mail.ne1.yahoo.com+ESMTP+YSmtp+service+ready 0 0 60 0 218 SMTP - - - -
2012-06-15 18:26:09 98.138.206.39 OutboundConnectionCommand SMTPSVC1 WEB10 - 25 EHLO - WEB10.DOMAIN>COM 0 0 4 0 218 SMTP - - - -
> 2012-06-15 18:26:09 74.125.244.10 OutboundConnectionResponse SMTPSVC1 WEB10 - 25 - - 550+IP+Authorization+check+failed+-+psmtp 0 0 41 0 218 SMTP - - - -
2012-06-15 18:26:09 74.125.244.10 OutboundConnectionCommand SMTPSVC1 WEB10 - 25 RSET - - 0 0 4 0 218 SMTP - - - - 

3行目は、一致し>た行であることを示すことで始まることに注意してください。select-string

に置き換えようとしています-replaceが、置き換えが機能しないようです。>< font color="red">$1< /font>

これが私のコードです:

$results = $results -replace "(^> )(.*)$", "< font color='red'>$1< font>" 

そこにあるPowerShell正規表現の達人は、私の正規表現が一致しない理由を教えてくれますか?

4

2 に答える 2

3

$a に 3 行目の値が含まれている場合は、次を試してください。

$a -replace '(^>)(.*)','font color="red">$2<font/>'

2つのこと:

  1. 正規表現に一重引用符を使用する
  2. グループのインデックスは 1 から始まります
于 2012-06-18T03:14:25.757 に答える
2

表示されるのは書式設定されたオブジェクトのみであり、select-string の実際の出力ではないため、テキストではなく think-object を開始する必要があります。この出力を解析する代わりに、取得したオブジェクトを使用します (Get-Member を使用すると、オブジェクトを検出できます)。

私はこれがあなたが必要とすることをするはずだと思います:

# Prepare test data...
$tring = @'
alfa
beta
gamma
delta
alfa
beta
alfa
beta
'@.Split("`n")

# Display results with actually matching line highlighted in red...
"<body>"
$tring | select-string 'delta' -Context 2,2 | foreach {
    $_.Context.PreContext
    "<font color='red'>$($_.Line)<font>"
    $_.Context.PostContext
}
"</body>"

HTH バーテック

于 2012-06-18T08:47:40.143 に答える