Например, у меня есть файл журнала с такой записью:
[Среда, 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