Показать только указанную c группу регулярных выражений и удалить остаток строки в bash с помощью sed - PullRequest
1 голос
/ 11 марта 2020

У меня есть журнал доступа со многими строками в следующем формате:

1.2.3.4:443  - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"

Я просто хочу получить время ответа, поэтому в этом примере 2/2125012. Моя идея заключалась в том, чтобы написать шаблон регулярных выражений, который соответствует содержанию скобок в группе и всему, что после / до него, в других группах. Таким образом, я мог бы заменить всю строку только на это значение:

^(.*)RESPONSE_TIME: \[([^\]]+)(.*)$

Используя 101regex с примерной строкой ввода, это дает мне `` в качестве второй группы, как и ожидалось:

Group 2 2/2125012

Чтобы использовать этот шаблон с egrep, я избежал скобок следующим образом:

$ sed 's#^\(.*\)RESPONSE_TIME: \[\([\^\]]+\)\(.*\)$#\2#g' testfile
1.2.3.4:443  - - [11/Mar/2020:09:41:05 +0100] RESPONSE_CODE:[200] AGE: [-] CACHE_MISS: [-] CACHE-STATUS: [-] SIZE: [1288] RESPONSE_TIME: [2/2125012] (microseconds) WAS:[was.internal:9444] "PUT /kudosboards/node/a8740540-801a-43a6-822a-d58a2424fd3f HTTP/1.1" 200 REFERER: "https://ihs.internal/kudosboards/"

Почему ничего не заменено? Я сбежал ( и [.

Кажется, это как-то связано с квадратными скобками:

$ sed 's#^\(.*\)RESPONSE_TIME: \[\(.*\)\] (micro\(.*\)$#\2#g' testfile
2/2125012

Это сработало. Но эти картины не очень конкретны c. Я хотел бы сделать его более конкретным c, добавив, например, [0-9]+/[0-9]+ для шаблона внутри скобок вместо (.*) шаблон шаблон.

Ответы [ 2 ]

1 голос
/ 11 марта 2020

В вашем паттерне есть проблема, связанная с использованием POSIX BRE / ERE: [\^\]]+ соответствует символу ^ или ], а затем + char ( demo ) , Вам нужно использовать * (что соответствует 0 или более вхождений ) вместо + или \+ в GNU sed или \{1,\} в общем c POSIX BRE.

Вы можете исправить команду sed, используя

sed -n 's#.*RESPONSE_TIME: \[\([^]]*\).*#\1#p' testfile

См. online sed demo .

Details

  • -n - подавляет вывод строки по умолчанию
  • .*RESPONSE_TIME: \[\([^]]*\).* - сопоставляет любые 0+ символов, RESPONSE_TIME:, пробел, [, затем захватывает в группу 1 любой ноль или более символов, кроме ], а затем соответствует оставшейся части строки
  • \1 - заменяет совпадение значением группы 1
  • p - печатает результат замещения.
0 голосов
/ 11 марта 2020
$ awk -F'[][]' '{print $14}' file
2/2125012

Если это не все, что вам нужно, отредактируйте ваш вопрос, чтобы обеспечить более по-настоящему репрезентативный пример ввода / вывода, включая случаи, для которых вышеописанное не работает.

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