Фильтруйте файл журнала, чтобы создать отчет в формате csv с помощью PowerShell

У меня есть выход журнала 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.0т (1149038714880)

Статус: (ч / б, онлайн, на карте)

И 4-я деталь, которая мне нужна, это Занятый размер: 1004,0 г (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

1 ответ

Решение
$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 параметр.
- чтобы извлечь только цифры внутри (...) для Total Space а также Occupied Size столбцы, используйте
$_ -match '^\s*(/vol.+?)\s+.+?\s+\((.+?)\)\s+(\(.+?\))' а также
$_ -match '\bOccupied Size: .+? \((.*)\)' вместо.

Обратите внимание на то, как это решение обрабатывает входной файл построчно, что снижает использование памяти, хотя обычно снижает производительность.


Что касается того, что вы пытались:

  • Вы собираете весь входной файл как массив в памяти ($logfile = Get-Content .\DeviceDetails.log)

  • Затем вы дважды фильтруете этот массив в параллельные массивы, содержащие соответствующие интересующие линии.

  • Все идет не так, когда вы пытаетесь вложить обработку этих двух массивов. Вместо вложения вы должны перечислять их параллельно, так как соответствующие им индексы содержат совпадающие записи.

  • Дополнительно:

    • такая строка, как 'LUN Name , Total Space, Status, Occupied Size' = "$o" создает одно свойство с именем LUN Name , Total Space, Status, Occupied Size, что не является намерением.
    • чтобы создать различные свойства (которые будут отображаться в виде отдельных столбцов в выходных данных CSV), вы должны создать их как таковые, что потребует соответствующего разбора входных данных на различные значения.
Другие вопросы по тегам