У меня есть журнал доступа со многими строками в следующем формате:
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]+
для шаблона внутри скобок вместо (.*)
шаблон шаблон.