Разбор строки Powershell. Вытащить дату из строки текста - PullRequest
1 голос
/ 22 октября 2019

У меня есть (простой текст) файл журнала с датами, которые появляются в большинстве (но не во всех) строках текста. Дата не всегда появляется в одной и той же позиции в каждой строке. Хотя не все строки имеют дату, в любом заданном наборе из 10 строк всегда есть дата. Образец журнала:

03/05/2019 Event A occurred
03/05/2019 Event B occurred
Event B Details: Details Details
03/07/2019 Event C occurred
Logging completed on 03/08/2019
03/08/2019 Event D occurred

Мне нужно получить дату последнего зарегистрированного элемента. Мне не нужно содержимое строки, только дата, которая находится в строке.

#Get the log file. Tail it because it's huge. The regex pattern matches date format dd/mm/yyyy.
$log = (Get-Content -tail 10 C:\mylog.log | Select-String -Pattern "\d{2}/\d{2}\/d{4}"
#Get the last item in the $log variable. Convert it to a string.
$string = $log[-1].toString()

#Split the string. Match each element to a date format. 
#When an element matches a date format, assign its value to a DateTime variable.
foreach ($s in $string.split() ){
    if ($s -match "\d{2}/\d{2}\/d{4}"){
        [DateTime]$date = $s
        }
    }
"The last entry in the log was made on $date"

Обе части этого кода (поиск последней строки с датой и извлечение даты из строки)кажись действительно глупым. Есть ли лучший способ сделать это?

1 Ответ

4 голосов
/ 22 октября 2019

Вы можете сделать следующее:

[datetime]((Get-Content mylog.log -tail 10) |
  Select-String '\d{2}/\d{2}/\d{4}')[-1].Matches.Value

Select-String возвращает коллекцию MatchInfo объектов. .Matches.Value каждого объекта содержит соответствующую строку. Используя индекс [-1], мы можем получить последний объект.

Примечание: Select-String имеет параметр -Path, который может читать файл. Но если вы не хотите читать весь файл, используется Get-Content -Tail.

...