0

多くのフィールドがリストされているログファイルがあります。ファイルからフィールドを抽出したいのですが、ファイルを1行ずつ検索したくありません。

私は私のパターンを持っています:

$pattern="Hostname \(Alias\):(.+)\(.+Service: (.+)"

これにより、必要な2つの値が得られます。文字列があり、一致するものを1つ探している場合は、$matches配列を使用してフィールドを見つけることができます。つまり、文字列変数$ lineを使用してファイル内の単一の行を表示している場合、このコードを使用してフィールドを抽出できます。

if($line -matches $pattern){
  $var1=$matches[1]
  $var2=$matches[2]
}

しかし、行ごとに検索せずにこれらの値を取得するにはどうすればよいですか?ファイル全体を1つの文字列として渡し、抽出する値を2つの異なる配列に追加したいと思います。

私はのようなものを探しています

while($filetext -match $pattern){
  $array1+=$matches[1]
  $array2+=$matches[2]
}

しかし、このコードでは、一致するものが1つでもある場合、無限ループに陥ります。では、使用できるnextMatch関数はありますか?

4

1 に答える 1

2

PowerShell 2.0は-AllMatches、コマンドレットにパラメーターを追加することでこの制限に対処しましたSelect-String。例:

$filetext | Select-String $pattern -AllMatches | 
    Foreach {$_.Matches | Foreach {$_.Groups[1] | Foreach {$_.Value}}}
于 2012-08-09T02:49:46.890 に答える