Фильтруйте файл журнала, чтобы создать отчет в формате 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), вы должны создать их как таковые, что потребует соответствующего разбора входных данных на различные значения.
- такая строка, как