#regex #scala #logging
#регулярное выражение #scala #ведение журнала
Вопрос:
Ниже приведен пример журнала, и я пытаюсь создать отдельный столбец для каждого типа данных:
unicomp6.unicomp.net - - [01/Jul/1995:00:00:14 -0400] "GET /shuttle/countdown/count.gif HTTP/1.0" 200 40310
хост — дата — URL — статус — байт
Я могу получить следующее:
- хост =
"""^([^(s|,)] )"""
- временная метка =
"""[(dd/w{3}/d{4}:d{2}:d{2}:d{2}s-d{4})]"""
- URL =
"""^.*w s ([^s] )s HTTP.*"""
но я не могу извлечь HTTP status (200) и byte (40310), и я перепробовал много регулярных выражений. например, я пробовал следовать для status: """[0-9][0-9][0-9]"""
и """/d/d/d""
и многие другие.
Редактировать: (Ответ) Статус = """d (?=sd $)"""
байт = s (d )$
Ответ №1:
Используйте look ahead, он отлично работает для отслеживания статуса 200:
d (?=sd $)
Комментарии:
1. эй, это работает как шарм, можете ли вы также помочь мне с размером байта?
2. Но это будет фиксировать только значение статуса, а как насчет других значений, таких как
host
,
URL-адрес метки времени и т. Д3. Я думаю, что mitochoondria уже знает, как извлечь хост, временную метку, URL, указанный в его вопросе.
4. для извлечения размера байта используйте это регулярное выражение:
d $
Ответ №2:
Вы можете использовать это регулярное выражение с 4 именованными группами захвата:
^(?<host>S )[^[] [(?<ts>d{2}/w{3}/d{4}(?::d{2}){3})[^]]*][^"]*"[A-Z]{3,} (?<url>S )[^"]*"s (?<status>d )
Демонстрация регулярных выражений
Подробности регулярных выражений:
^
: Начать(?<host>S )
: Группаhost
, которая содержит более 1 символов, не содержащих пробелов[^[] [
: Сопоставьте 1 не[
символы, за которыми следует[
(?<ts>d{2}/w{3}/d{4}(?::d{2}){3})
: Группаts
, соответствующая подстроке даты и времени[^]]*]
: Сопоставьте 0]
символов, за которыми следует]
[^"]*"
: Сопоставьте 0"
символов, за которыми следует"
[A-Z]{3,}
: Сопоставьте http-глагол, напримерGET
,PUT
,POST
,DELETE
и т. Д(?<url>S )
:url
группировка для сопоставления с 1 символами, не содержащими пробелов[^"]*"
: Сопоставьте 0"
символов, за которыми следует"
s
: Сопоставьте 1 пробельные символы(?<status>d )
:status
группа для сопоставления 1 цифр
Комментарии:
1. эй, я думаю, что открытых квадратных скобок больше, чем закрытых, можете ли вы проверить еще раз?
2. пожалуйста, проверьте сейчас в ответе, как в демонстрации