1

以下の形式のログ ファイルに NetApp ログ出力があります。

DeviceDetails.log ファイルの内容

  /vol/DBCXARCHIVE002_E_Q22014_journal/DBCXARCHIVE002_E_Q22014_journal    1.0t (1149038714880) (r/w, online, mapped)
    Comment: " "
    Serial#: e3eOF4y4SRrc
    Share: none
    Space Reservation: enabled (not honored by containing Aggregate)
    Multiprotocol Type: windows_2008
    Maps: DBCXARCHIVE003=33
    Occupied Size: 1004.0g (1077986099200)
    Creation Time: Wed Apr 30 20:14:51 IST 2014
    Cluster Shared Volume Information: 0x0 
    Read-Only: disabled
/vol/DBCXARCHIVE002_E_Q32014_journal/DBCXARCHIVE002_E_Q32014_journal  900.1g (966429273600)  (r/w, online, mapped)
    Comment: " "
    Serial#: e3eOF507DSuU
    Share: none
    Space Reservation: enabled (not honored by containing Aggregate)
    Multiprotocol Type: windows_2008
    Maps: DBCXARCHIVE003=34
    Occupied Size:  716.7g (769556951040) 
    Creation Time: Tue Aug 12 20:24:14 IST 2014
    Cluster Shared Volume Information: 0x0 
    Read-Only: disabled 

出力は 2 つのデバイスのみであり、ログ ファイルには x を超えるデバイスが追加されています。

各モジュールから 4 つの詳細が必要です。最初の行には 3 つの必要な詳細が含まれています

デバイス名: /vol/DBCXARCHIVE002_E_Q22014_journal/DBCXARCHIVE002_E_Q22014_journal

総容量 : 1.0t (1149038714880)

ステータス : (r/w、オンライン、マップ済み)

そして、必要な 4 番目の詳細は占有サイズです: 1004.0g (1077986099200)

したがって、CSV 出力は次のようになります。ここに画像の説明を入力

私はコーディングの初心者ではなく、以下のコードでこれを達成しようとしていますが、あまり役に立ちません:/

$logfile = Get-Content .\DeviceDetails.log
$l1 = $logfile | select-string "/vol"
$l2 = $logfile | select-string "Occupied Size: " 

$objs =@()
$l1 | ForEach {
$o = $_ 
$l2 | ForEach {
    $o1 = $_
    $Object22 = New-Object PSObject -Property @{
        'LUN Name , Total Space, Status, Occupied Size'  = "$o"
        'Occupied Size'  = "$o1"           
    }           

}
$objs += $Object22  
}
$objs
4

1 に答える 1

0
$obj = $null # variable to store each output object temporarily
Get-Content .\t.txt | ForEach-Object { # loop over input lines
  if ($_ -match '^\s*(/vol.+?)\s+(.+? \(.+?\))\s+(\(.+?\))') {
    # Create a custom object with all properties of interest,
    # and store it in the $obj variable created above.
    # What the regex's capture groups - (...) - captured is available in the
    # the automatic $Matches variable via indices starting at 1.
    $obj = [pscustomobject] @{
      'Device Name' = $Matches[1]
      'Total Space' = $Matches[2]
      'Status' = $Matches[3]
      'Occupied Size' = $null # filled below
    }
  } elseif ($_ -match '\bOccupied Size: (.*)') {
    # Set the 'Occupied Size' property value...
    $obj.'Occupied Size' = $Matches[1]
    # ... and output the complete object.
    $obj
  }
} | Export-Csv -NoTypeInformation out.csv

Export-Csv-デフォルトは ASCII 出力エンコーディングであることに 注意してください。パラメータでそれを変更し-Encodingます。- and列の
内部の数値のみを抽出する(...)には、代わりにandを使用します。 Total SpaceOccupied Size
$_ -match '^\s*(/vol.+?)\s+.+?\s+\((.+?)\)\s+(\(.+?\))'
$_ -match '\bOccupied Size: .+? \((.*)\)'

このソリューションが入力ファイルを行ごとに処理する方法に注意してください。これにより、一般的にパフォーマンスが犠牲になりますが、メモリの使用量が抑えられます。


あなたが試したことについて:

  • 入力ファイル全体をメモリ内の配列として収集します ( $logfile = Get-Content .\DeviceDetails.log)

  • 次に、この配列を 2 回フィルター処理して、対象の対応する行を含む並列配列にします。

  • これら 2 つの配列の処理をネストしようとすると、問題が発生します。ネストする代わりに、対応するインデックスに一致するエントリが含まれているため、それらを並列に列挙する必要があります。

  • さらに:

    • のような行は、目的ではないという名前の単一のプロパティを'LUN Name , Total Space, Status, Occupied Size' = "$o"作成します。LUN Name , Total Space, Status, Occupied Size
    • 個別のプロパティを作成するには (CSV 出力で個別の列として反映されるように)、そのように作成する必要があります。これには、それに応じて入力を個別の値に解析する必要があります。
于 2017-12-17T19:46:48.850 に答える