PowerShell сортировка по дате и времени - PullRequest
0 голосов
/ 17 сентября 2018

Я хочу сказать, что (я пингвин) я не Windows или парень из Powershell, но это не должно мешать мне помогать нашей команде Windows.

Мне нужно объединить два журнала исортировать их по дате и времени.Я думаю, что объединение их должно быть достаточно простым, но сортировка по дате и времени, кажется, немного сбивает меня с толку.

Журнал, с которым я работаю, не имеет одинакового количества столбцов и т.д.Я несколько нормализую журнал, чтобы попытаться отсортировать по logline [3,4], который является датой и временем.

"SMTPD" 4416    2476943 "2018-09-11 23:53:37.410"   "1.1.1.1"   "SENT: 221 goodbye"
"TCPIP" 4308    "2018-09-11 23:59:47.255"   "TCP - 1.1.1.2 connected to 1.1.1.1:25."
"SMTPD" 4308    2476952 "2018-09-11 23:22:47.255"   "1.1.1.1"   "SENT: 220 mx9.bobdestroyer.com ESMTP"
"SMTPD" 4416    2476952 "2018-09-11 23:35:47.255"   "1.2.3.4"   "RECEIVED: EHLO smtp-cow-666"
"SMTPD" 4416    2476952 "2018-09-11 23:22:47.255"   "1.1.1.1"   "SENT: 250-mx5.bobthedestroyer.com[nl]250-SIZE 20480000[nl]250-AUTH LOGIN[nl]250 HELP"
"SMTPD" 4232    2476952 "2018-09-11 23:53:47.255"   "1.1.1.1"   "RECEIVED: MAIL FROM:<bobtheBuilder@builders.com>"
"SMTPD" 4232    2476952 "2018-09-11 23:59:47.255"   "1.1.1.1"   "SENT: 250 OK"
"SMTPD" 4416    2476952 "2018-09-11 23:11:47.270"   "1.1.1.1"   "RECEIVED: RCPT TO:<bobtheBuilder@builders.com>"
"SMTPD" 4416    2476952 "2018-09-11 23:22:47.270"   "1.1.1.1"   "SENT: 250 OK"
"SMTPD" 4308    2476952 "2018-09-11 23:55:47.270"   "1.1.1.1"   "RECEIVED: DATA"
"SMTPD" 4308    2476952 "2018-09-11 23:21:47.270"   "1.1.1.1"   "SENT: 354 OK, send."
"SMTPD" 4000    2476952 "2018-09-11 09:53:48.208"   "1.1.1.1"   "SENT: 250 Queued (0.768 seconds)"
"APPLICATION"   3100    "2018-09-11 11:53:48.208"   "SMTPDeliverer - Message 2570349: Delivering message from bobtheBuilder@builders.com to bobtheDestroyers@Destroyerrs.com . File: C:\Program Files (x86)\servers\toomanysecrets\{49E08D79-C4A5-43F1-9435-9999999999}.eml"
"APPLICATION"   3100    "2018-09-11 12:12:48.208"   "SMTPDeliverer - Message 2570349: Relaying to host bobtheBuilder@builders.com ."

Вот что я написал:

$Unclean_LogLines = Get-Content .\BHmailLog.txt

#$LogLines | %{"$($_.Split()[0,1,2,3,4,5,6,7,8,9,10,11,12,13 ])"}


$AppendedLogLines = [System.Collections.ArrayList]@()


#Attempts to normalise the log.... And even out the columns.So that I can grap $_[3,4] for each line.
#perhaps a simple foreach + regex would be better....

$Unclean_LogLines | foreach-object {

    $firstcolumn = ($_ -split '\s+',4)[0]
    if($firstcolumn -eq '"APPLICATION"'){
        $_ = '"APPLICATION" ' + $_ 
         $AppendedLogLines.Add($_ + "`n")

    }

    elseif($firstcolumn -eq '"TCPIP"'){
         $_ = '"TCPIP" ' + $_ 
         $AppendedLogLines.Add($_ + "`n") # minor problem here. I am not 100% normalising the log... I should make _$[2] = 4248 or something. 

    }
    else{
      $AppendedLogLines.Add($_ + "`n")

    }


}
"FINISHED NORMALISING!! "

   $AppendedLogLines| foreach-object {


    $timestamp,$null = %{"$($_.Split()[3,4])"}
     $timestamp = $timestamp.Replace('"','') # remove the last qoate....


  $_ |sort-object -property { 

    }

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Чтобы выполнить сортировку по меткам времени , вам не нужно строго нормализовать журналы :

Get-Content ./BHmailLog.txt | 
  Sort-Object { [datetime] ($_ -replace '^.*?"(\d{4}-\d{2}-\d{2} [^"]+).*', '$1') }

Примечание:
* Для краткости я сократил регулярное выражение, извлекающее временную метку, до совпадения только с частью даты, но его можно сделать более строгим.
* Если их несколько, сортируется по первой отметке времени, обнаруженной в каждой строке.

Подход:

  • использует -replace с регулярным выражением и группой захвата для извлечения метки времени из каждой строки ввода,
  • преобразует эту временную метку строки в экземпляр [datetime] посредством приведения,
    • Обратите внимание, что это приведение работает независимо от того, какая культура используется, поскольку PowerShell использует инвариантную культуру при приведении / разборе строк, где это возможно, и ваши временные метки находятся в в формат, распознаваемый инвариантной культурой.
  • , который через вычисляемое свойство ({ ... }) заставляет Sort-Object выполнить правильную хронологическую сортировку.

Обратите внимание, что вы можете использовать описанный выше подход даже , если вы сначала нормализовали свои журналы , но в том случае, если вы предпочитаете ориентировать метки времени по полю indexes :

$AppendedLogLines | Sort-Object { [datetime] ((-split $_)[3,4] -join ' ' -replace '"') }

Хотя это, возможно, концептуально чище и легче для понимания, я не уверен, какой подход работает лучше.

0 голосов
/ 17 сентября 2018

Довольно сложная задача. Я не могу написать код для этого, но могу дать несколько советов. Разбить каждую строку, используя пробел в качестве разделителя. Тогда вам придется взглянуть на каждый элемент (или только на3-й или 4-й) и посмотрите, соответствует ли он дневному / временному графику.Если это так, вуаля;есть ваш поисковый элемент ... добавьте его в хеш в качестве ключа и всю строку в качестве данных.Затем сортируйте свою хэш-таблицу.Вот как бы я подошел к этому.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...