Назад | Перейти на главную страницу

извлечение подстроки bash для указанного начального и конечного символа

Например, у меня есть файл журнала с такой записью:

[Среда, 8 августа, 11:39:41 2012] [ошибка] [клиент 155.94.70.224] ModSecurity: [файл "/etc/httpd/modsecurity.d/rules/base_rules/modsecurity_crs_20_protocol_violations.conf"] [строка "271"] [ id "960020"] [версия "2.2.5"] [msg "Заголовок Pragma требует заголовка Cache-Control для запросов HTTP / 1.1."] [серьезность "NOTICE"] [тег "RULE_MATURITY / 5"] [тег "RULE_ACCURACY / 7 "] [тег"https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"] [тег" PROTOCOL_VIOLATION / INVALID_HREQ "] [тег"http://www.bad-behavior.ioerror.us/documentation/how-it-works/"] Предупреждение. Строка соответствует" HTTP / 1.1 "в REQUEST_PROTOCOL. [Имя хоста" webmail.white-art.co.uk "] [uri" /horde/themes/graphics/tree/plusonly.png "] [unique_id" UCJB7VveCGYAAG @ BHJgAAAAQ "]

Я хочу извлечь все пары строк, начиная с символа [ и заканчивая ]. Я могу использовать cut или awk для извлечения с использованием одного разделителя, но мне нужно извлечь строку между запуском [ и окончание ]. как этого добиться?

Например, мне нужно извлечь:

"[тег" RULE_ACCURACY / 7 "]"

и

"[серьезность" ВНИМАНИЕ "]"

из журнала.


Я нашел решение, что сначала мне нужно взорвать журнал, добавляя новую строку после каждого ] а затем с помощью grep найдите требуемую строку. Есть ли лучший способ сделать это?

Я думаю, это разделит строку, как вы хотите

sed -e 's/\]/\]\n/g' log | sed -e 's/^ *//g' | awk '/^\[/ {print}'

Сначала ставьте новую строку после каждого ] затем удалите все начальные пробелы и, наконец, напечатайте строки, начинающиеся с [.

Ваша строка ввода становится

[Wed Aug 08 11:39:41 2012]
[error]
[client 155.94.70.224]
[line "271"]
[id "960020"]
[rev "2.2.5"]
[msg "Pragma Header requires Cache-Control Header for HTTP/1.1 requests."]
[severity "NOTICE"]
[tag "RULE_MATURITY/5"]
[tag "RULE_ACCURACY/7"]
[tag "https://www.owasp.org/index.php/ModSecurity_CRS_RuleID-960020"]
[tag "PROTOCOL_VIOLATION/INVALID_HREQ"]
[tag "http://www.bad-behavior.ioerror.us/documentation/how-it-works/"]
[uri "/horde/themes/graphics/tree/plusonly.png"]
[unique_id "UCJB7VveCGYAAG@BHJgAAAAQ"]

Эта одна команда сделает то, что вы хотите:

grep -o '\[[^]]*\]' inputfile