Как вытащить несколько IP-адресов из многострочного журнала? - PullRequest
0 голосов
/ 07 мая 2019

Regex ароматизатор PCRE

У меня есть многострочный журнал, с которого я пытаюсь получить IP-адреса. Иногда в списке указан один IP-адрес, а иногда в качестве разделителя указывается несколько IP-адресов. У меня было регулярное выражение, работающее при извлечении одного или нескольких IP-адресов, но проблема заключалась в том, что мне нужно было добавить дополнительные условия для извлечения нескольких IP-адресов только из одного типа события

Я пробовал множество различных регулярных выражений на regex101.com безрезультатно

Token\sType:(?:\n|.)*Client\sIP:\s+(?<adfs_src>:\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(\K,)\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})

Пример журнала ADFS:

Microsoft ADFS logs and here is an example: 05/07/2019 03:06:54 PM LogName=Security SourceName=AD FS Auditing EventCode=411 EventType=0 Type=Information ComputerName=x.y.z User=abc Sid=A-9-3-98-1231231313-1231231313-1231231313-406293 SidType=1 TaskCategory=Printers OpCode=Info RecordNumber=###### Keywords=Audit Failure, Classic Message=Token validation failed. See inner exception for more details. Additional Data Activity ID: 00000000-0000-0000-0000-000000000000 Token Type: http://schemas.microsoft.com/ws/2006/05/identitymodel/tokens/UserName Client IP: 10.1.1.1,10.1.1.2  Error message: user@foo.com -The user name or password is incorrect Exception details: System.IdentityModel.Tokens.SecurityTokenValidationException: user@foo.com ---> System.ComponentModel.Win32Exception: The user name or password is incorrect at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUserHandle(SafeHGlobalHandle pLogonInfo, Int32 logonInfoSize, SafeCloseHandle& tokenHandle, SafeLsaReturnBufferHandle& profileHandle) at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUserInfo(SafeHGlobalHandle pLogonInfo, Int32 logonInfoSize, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String authenticationType, String issuerName) at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUser(UserNameSecurityToken token, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String issuerName) at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateTokenInternal(SecurityToken token) --- End of inner exception stack trace --- at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateTokenInternal(SecurityToken token) at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateToken(SecurityToken token) System.ComponentModel.Win32Exception (0x80004005): The user name or password is incorrect at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUserHandle(SafeHGlobalHandle pLogonInfo, Int32 logonInfoSize, SafeCloseHandle& tokenHandle, SafeLsaReturnBufferHandle& profileHandle) at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUserInfo(SafeHGlobalHandle pLogonInfo, Int32 logonInfoSize, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String authenticationType, String issuerName) at Microsoft.IdentityServer.Service.Tokens.LsaLogonUserHelper.GetLsaLogonUser(UserNameSecurityToken token, DateTime& nextPasswordChange, DateTime& lastPasswordChange, String issuerName) at Microsoft.IdentityServer.Service.Tokens.MSISWindowsUserNameSecurityTokenHandler.ValidateTokenInternal(SecurityToken token)

Поиск регулярного выражения, которое работает, когда для IP-адреса клиента указан один или несколько IP-адресов

Thx

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Вы можете использовать повторяющиеся совпадения, используя \G для сопоставления типа токена и нескольких вхождений номеров ip:

(?:(^Token\sType):\s*(?:\n(?!Client IP:).*)+\nClient IP:\s*\n|\G)(?<adfs_src>(?:\d{1,3}\.){3}\d{1,3})(?:[,\s]|$)
  • (?: Группа без захвата
    • (Token\sType) захват в группе 1
    • (?:\n(?!Client IP:).*)+ Соответствует строке, если она не начинается с IP-адреса клиента:
    • \nClient IP:\s*\n Соответствие новой строки, IP-адреса клиента: затем пробельные символы и символ новой строки
    • | или
    • \G Утверждение позиции в конце предыдущего матча
    • (?<adfs_src>(?:\d{1,3}\.){3}\d{1,3}) Захват в группе adfs_src в формате 'ip like' (обратите внимание, что это не проверяет сам ip)
  • ) Закрыть группу без захвата
  • (?:[,\s]|$) Соответствует запятой, символу пробела или утверждению конца строки.

Regex demo

Если вы хотите, чтобы номера ip, включая запятую, вы могли использовать:

(Token\sType):\s+\S+ Client IP: (?<adfs_src>(?:\d{1,3}\.){3}\d{1,3}(?:,(?:\d{1,3}\.){3}\d{1,3})*)

Regex demo

1 голос
/ 07 мая 2019

Заменить x на \d{1,3

(?s)Token\sType:.*?Client\sIP:\s+(?|(?<adfs_src>:x(?:\.x){3})|x(?:\.x){3},\K(?<adfs_src>x(?:\.x){3}))

https://regex101.com/r/iw4Hm7/1

Читаемое регулярное выражение

 (?s)
 Token \s Type:
 .*? 
 Client \s IP: \s+ 

 (?|
      (?<adfs_src>                  # (1 start)
           :x (?: \.x ){3}
      )                             # (1 end)
   |  
      x (?: \.x ){3}
      , \K 
      (?<adfs_src>                  # (1 start)
           x (?: \.x ){3}
      )                             # (1 end)
 )

PS.Пришлось проверить 7 экранов проверки пешеходных переходов.SO также выводит меня из системы, когда я захожу на regex101.com, а затем закрываю это окно.

Примечание. На днях я добавил «Файл MVPS HOSTS» (440 k), чтобы предотвратить его.ads.
Я не вернулся к старому файлу hosts, чтобы проверить, что такого поведения
не произойдет, возможно, в будущем я это сделаю.

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