2016-11-24 8 views
0

Я хотел бы сократить числа между квотами идентификатора Mod_sec: [id "31231"]. Как правило, это не сложно, но когда я пытаюсь извлечь все идентификаторы из нескольких отчетов, таких как:Cut Mod_Security ID с sed/awk

[Wed Oct 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "000784"] [hostname "example.org"] [uri "/"] [unique_id "[email protected]@HQAAAAI"] 

[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "9"] [hostname "example.org"] [uri "/"] [unique_id "[email protected]@HQAAAAI"] 

[Wed Mar 19 15:31:33.460342 2016] [:error] [pid 16526] [client 67.22.202.121] ModSecurity: Access denied with code 400 (phase 2). Operator EQ matched 0 at REQUEST_HEADERS. [file "/usr/local/apache/conf/includes/mod_security2.conf"] [line "4968"] [id "00263"] [hostname "example.org"] [uri "/"] [unique_id "[email protected]@HQAAAAI"] 

Я попытался несколько команд, таких как:

cat asd | awk '/\[id\ "/,/"]/{print}' 
cat asd | sed -n '/[id "/,/"]/p' 

и многие другие, но они делают не печатать требуемые идентификаторы, а скорее включать дополнительный вывод, поскольку шаблон сопоставляется несколько раз. Обычно я могу сделать что-то вроде:

cat asd | egrep -o "\"[0-9][0-9][0-9][0-9][0-9][0-9]\"", а затем вырезать вывод еще раз, но это не работает в случаях, когда идентификатор не содержит 6 номеров.

Я не знаком со всеми опциями awk, sed и egrep и, похоже, не нашел решения.

То, что я хотел бы быть распечатаны из выше истории:

000784

9

00263

Может кто-то пожалуйста, помогите. Заранее спасибо.

ответ

0

С grep если pcre опция доступна:

$ grep -oP 'id "\K\d+' asd 
000784 
9 
00263 
  • id "\K положительный просмотра назад, чтобы соответствовать id ", а не часть продукции
  • \d+ цифры следующие id "


С sed

$ sed -nE 's/.*id "([0-9]+).*/\1/p' asd 
000784 
9 
00263 
  • .*id " матч до id "
  • ([0-9]+) захвата группы, чтобы сохранить цифры необходимо
  • .* остальные линии
  • \1 вся линия заменена только с искомой строки
+0

Thank yo u so much Sundeep, как sed, так и grep-решения работают отлично. Я боролся с этим уже 2 недели. Благодарим вас за быстрый ответ и объяснение! –

+0

@AngelAsenov рад, что это помогло ... вы можете проверить документацию по этим темам на SO для примеров, если вам интересно ... например: https://stackoverflow.com/documentation/awk/topics и https: // stackoverflow .com/documentation/regex/topics – Sundeep

+0

Представленные темы, как представляется, дают очень полезную информацию. Большое вам спасибо. –

1

С sed:

sed -n 's/.*\[id "\([^"]*\)"].*/\1/p' 
  • вы должны потреблять все детали перед [id и после того, как ваш маркером
  • вам нужно бежать квадратную скобку
+0

Спасибо, что так много, это решение sed работает безупречно. Я боролся с этим уже 2 недели. Спасибо. –

0

Идентификаторы доступны в 6 awk поле при двойном котировки используются в качестве пользовательских разделителей:

$ awk -F '"|"' '{print $6}' file 
000784 
9 
00263 
+0

Спасибо, я не знал, что вы можете напечатать строку между выбранными разделителями, используя | разделитель. Это представляется очень полезным. –