none
Обработка строк-парсинг текстового log файла RRS feed

  • Вопрос

  • Есть текстовый log файл,

    заполнен строками вида:

     

    Code Snippet

    Message: 2008/10/23 07:03:17 Data transfer completed Thu, 23 October 2008 7:03:17 AM
    Message: 2008/10/23 07:03:17 Backup was successful
    Message: 2008/10/23 07:03:17 Updating cache in E:\Attix5 Backup Professional SE\cache
    Message: 2008/10/23 07:04:15 Cleaning up cache
    Message: 2008/10/23 07:04:15 Cleaning up temporary files
    Message: 2008/10/23 07:04:15 Backup Done
    Message: 2008/10/23 07:04:15 -------------------- Backup Summary --------------------
    Message: 2008/10/23 07:04:15 Total selection: 11.17 GB in 21,727 files and folders
    Message: 2008/10/23 07:04:15 Index file: 1.08 MB
    Message: 2008/10/23 07:04:15 Patched index file: 1.8 KB
    Message: 2008/10/23 07:04:15 New files: 0; 0.0 KB (comp: 0.0 KB)
    Message: 2008/10/23 07:04:15 Removed files: 0; 0.0 KB
    Message: 2008/10/23 07:04:15 Patched files: 1; 568.99 MB + 327.7 KB --> 568.99 MB
    Message: 2008/10/23 07:04:15 Skipped files: 0

     

     

    Нужно получить список со всеми значениями "11.17"

     

    Подумал использовать Select-string:

    Code Snippet

    Select-string -path logfile.log -pattern "Total selection:(.)*in"

     

    Выдаёт результат всех строк, которые удовлетворяют шаблону и содержат это значение:

    Code Snippet

    logs\20081023070004.log:11:Message: 2008/10/23 07:02:00 Total selection: 11.17 GB in 21,727 files and folders
    logs\20081023070004.log:48:Message: 2008/10/23 07:04:15 Total selection: 11.17 GB in 21,727 files and folders

     

     

    Каким образом теперь из полученных строк можно вырезать только это значене "11.17"?

    23 октября 2008 г. 7:11

Ответы

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

     

    Code Snippet

    $fileName = "test.txt"

    $rePattern = "Message: (?<year>\d+)/(?<month>\d+)/(?<day>\d+) (?<hour>\d+):(?<minute>\d+):(?<second>\d+) Total selection: (?<size>\d+.\d+) (?<prefix>\w+) in (?<numberOfFiles>\d+\,\d+) files and folders"

     

    Get-Content $fileName | ForEach-Object {
      if ($_ -match $rePattern)
      {
        $matches
      }
    }

     

     

     

    В итоге получите следующее:

     

    Code Snippet

    Name                           Value
    ----                           -----
    size                           11.17
    minute                         04
    month                          10
    second                         15
    prefix                         GB
    hour                           07
    numberOfFiles                  21,727
    year                           2008
    day                            23
    0                              Message: 2008/10/23 07:04:15 Total selection: 11.17 GB in 21,727 files and folders

     

     

     

    Вытащить из этого искоемое вами значение можно так:

     

    Code Snippet
    $matches["size"]

     

     

     


     

    23 октября 2008 г. 7:37

Все ответы

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

     

    Code Snippet

    $fileName = "test.txt"

    $rePattern = "Message: (?<year>\d+)/(?<month>\d+)/(?<day>\d+) (?<hour>\d+):(?<minute>\d+):(?<second>\d+) Total selection: (?<size>\d+.\d+) (?<prefix>\w+) in (?<numberOfFiles>\d+\,\d+) files and folders"

     

    Get-Content $fileName | ForEach-Object {
      if ($_ -match $rePattern)
      {
        $matches
      }
    }

     

     

     

    В итоге получите следующее:

     

    Code Snippet

    Name                           Value
    ----                           -----
    size                           11.17
    minute                         04
    month                          10
    second                         15
    prefix                         GB
    hour                           07
    numberOfFiles                  21,727
    year                           2008
    day                            23
    0                              Message: 2008/10/23 07:04:15 Total selection: 11.17 GB in 21,727 files and folders

     

     

     

    Вытащить из этого искоемое вами значение можно так:

     

    Code Snippet
    $matches["size"]

     

     

     


     

    23 октября 2008 г. 7:37
  • Я подправил пост, так куда делись идентификаторы совпадений.

     

    Ещё один момент, если файл очень большой, то тогда имеет смысл сделать одно скомпилированое регулярное выражение и "травит" его на все строки так будет значительней быстрее.

     

    23 октября 2008 г. 7:46
  • Работает! КЛАСС!

     

    да...PowerShell действительно Power!

    23 октября 2008 г. 7:52