Еще про парсинг логов

В предыдущем посте я описал как я разобрал один конкретный лог. Скрипт был набросан на скорую руку, не шибко красив, и далеко не универсален. А сейчас я написал функцию которая может разобрать большинство логов где параметры записаны на разных строках и используется строка разделитель. Стоит отметить что это далеко не единственный вариант реализации (у меня в голове болтаються еще 3 минимум🙂 и конечно не самый лучший. Но тем не менее со многими задачами он справится.

Итак, пример лога:

------------------
id: user001
byte in: 1234234
byte out: 12342334454
-----------------------
id: user002
byte in: 5463456
byte out: 4563456
-----------------------------
id: user003
byte in: 456745
byte out: 5467
-----------------------

И скрипт:

Function Parse-MultilinedLog($logFile=${throw 'You must specify log file name'}, $value="^(.+?):(.*)$", $separator="^\-+$")
{
	get-content $logfile | foreach { #для каждой строки из файла...
		#конструкция switch выбирающая действие в зависимости от соответствия элемента регекспу
		switch -regex ($_) 
		{
			($separator) { #разделитель
				$obj #выводим предыдущий объект
				$obj = new-object psobject #создаём новый
			}
			($value) { #параметр
				#добавляем параметр и значение к объекту
				$obj | add-member -membertype noteproperty -name ($matches[1].trim()) -value ($matches[2].trim())
			}
		}
	}
}

Функции необходимо указать имя лог файла, и в случае если разделитель или формат значения отличаются от указанных по умолчанию — то и соответствующие регекспы.

PS L:\PowerShell> Parse-MultilinedLog test.log | Format-Table -AutoSize

id      byte in byte out
--      ------- --------
user001 1234234 12342334454
user002 5463456 4563456
user003 456745  5467
Опубликовано в PowerShell. Комментарии к записи Еще про парсинг логов отключены
%d такие блоггеры, как: