Регулярно сопоставлять строку после времени - PullRequest
0 голосов
/ 31 октября 2018

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

  • 1 ноября 00:00:21 akdcs20.ftc.abcd-ipsn AKDCS20 fpc0 LBCM-L2, brcm_port_learning_config (), 1258: (brcm_port_learning_config: 1258) Настройка единицы обучения L2: 0, номер_порта: 44, learn_flg 5
  • 1 ноября 01:27:16 spnztpm01.abcd-ipsn 553177: LC / 0/0 / CPU0: 1 ноября 01: 27: 16.040: ifmgr [200]:% PKT_INFRA-LINEPROTO-5-UPDOWN: строка протокол на интерфейсе TenGigE0 / 0/0 / 1.172153, измененное состояние на Up

  • 31 октября, 23:59:56 akdcs19.ftc.abcd-ipsn AKDCS19 ufdd [1679]: ufd_group_config_if_lookup ifname ae4

Для всех трех вышеприведенных строк я хочу извлечь

  • akdcs19.ftc.abcd-ipsn
  • spnztpm01.abcd-IPSN
  • akdcs20.ftc.abcd-IPSN

текущее регулярное выражение, которое я использую ^(?:[^ \n]* ){4}(?P<devicename1>[^ ]+)

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Учитывая, что частью даты всегда будет месяц с 3 символами, день с 1-2 и время с ЧЧ: ММ: сс:

^(?:\w{3}\s\d{1,2}\s\d{2}:\d{2}:\d{2}\s)(?P<devicename1>[^ ]+)

Regex 101

0 голосов
/ 31 октября 2018

Вы можете использовать

\s\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)

См. Демоверсию regex .

Или более явный шаблон:

^\w+\s+\d+\s+\d{2}(?::\d{2}){2}\s+(?P<devicename1>\S+)

См. еще одно демо .

Детали

  • ^\w+\s+\d+\s+ - начало строки, 1+ слов, 1+ пробелов, 1+ цифр, 1+ пробелов (то есть, чтобы убедиться, что мы попадаем в нужную временную подстроку)
  • \d{2} - две цифры
  • (?::\d{2}){2} - две последовательности : и две цифры
  • \s+ - 1+ пробелов
  • (?P<devicename1>\S+) - Группа "devicename1": один или несколько непробельных символов.
...