2015-09-29 3 views
0

Мне нужно получить последние записи X файла modsec_audit.log в bash и записать его в новый файл. Я знаю, что это возможно с помощью tail и sed, но это возможно отключается в определенной строке и заставляет половину сообщения оставить в начале.
Есть ли более чистый способ сделать это? Мне просто нужно получить X последних событий/элементов из файла журнала.Как получить последние X-записи файла modsec_audit.log?

Для тех, кто не знаком с логами ModSecurity, вот пример modsec_audit.log файла:

--38321e0f-E-- 
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>503 Service Unavailable</title> 
</head><body> 
<h1>Service Unavailable</h1> 
<p>The server is temporarily unable to service your 
request due to maintenance downtime or capacity 
problems. Please try again later.</p> 
<hr> 
<address>Apache/2.4.7 (Ubuntu) Server at 10.211.55.6 Port 80</address> 
</body></html> 

--38321e0f-H-- 
Message: Access denied with code 503 (phase 2). Pattern match "block_hack" at ARGS:block_hack. [file "/usr/share/modsecurity-crs/activated_rules/block_hack.conf"] [line "2"] [id "11212"] 
Action: Intercepted (phase 2) 
Apache-Handler: application/x-httpd-php 
Stopwatch: 1443442449908332 455 (- - -) 
Stopwatch2: 1443442449908332 455; combined=23, p1=6, p2=15, p3=0, p4=0, p5=2, sr=0, sw=0, l=0, gc=0 
Response-Body-Transformed: Dechunked 
Producer: ModSecurity for Apache/2.7.7 (http://www.modsecurity.org/). 
Server: Apache/2.4.7 (Ubuntu) 
Engine-Mode: "ENABLED" 

--38321e0f-Z-- 
+0

Зачем вам это нужно? Файл ошибки Apache будет содержать информацию о любой ошибке в одной строке, с которой часто бывает легче справиться, чем пытаться разобраться с многострочным журналом аудита. –

+1

Я делаю приложение Modsecurity. Таким образом, мне нужно получить доступ к последним X-файлам файла modsecurity. Я знаю, что apache также имеет полезную информацию, но мне нужно сосредоточиться здесь на modsec_audit.log. –

+1

Хорошо. Просто подумал, что я упомянул бы, если бы вы не знали, что ModSecurity также регистрируется в файле ошибок Apache в более удобном формате grep-able. Но в нем нет такой информации, как журнал аудита. –

ответ

0

некоторые взлому с AWK и нолики

старт с щедрым хвостом, реверс, верх печати 3 записи, реверс

tail -100 log2 | tac | awk -vRS= -vORS="\n\n" 'NR<4' | tac 

будет печатать последние 3 записи из оригинального журнала.

Объяснение:

Поскольку лог-файл может быть очень большим, вы можете ограничить работу на последних строках. Если ваши записи имеют длину 10 строк, tail - соответствующий раздел, который будет содержать не менее n * 10 строк. Поскольку большинство других инструментов awk начинаются с начала файла, вот почему мы меняем строки с tac печатными записями n и возвращаем обратно в исходный формат.

RS= устанавливает режим awk в абзац (записи разделяют одну или несколько пустых строк), аналогично ORS="\n\n" для печати записей, разделенных пустой строкой. NR<4 условие будет верно для записей 1,2,3 и будет напечатано (как действие по умолчанию awk). -v - необязательный тег для определения переменных.

+1

Спасибо, что работает! Но в моем случае это показывает лучшие 2 записи (что не является проблемой, а просто является побочным эффектом). –

+1

не могли бы вы объяснить «хвост -100», а «awk -vRS = -vORS =» \ n \ n "'NR <4' | tac" –

+0

см. Обновление. Если у вас есть 2 записи, возможно, 100 строк недостаточно. – karakfa

0

Другим вариантом может быть, как это ... grep для всех -- в начале строк и пронумеровать их, как это:

grep -n "^--" modsec_audit.log 

Пример вывода

1:--38321e0f-E-- 
14:--38321e0f-H-- 
25:--38321e0f-Z-- 
26:--38321e0f-E-- 
39:--38321e0f-H-- 
50:--38321e0f-Z-- 
51:--38321e0f-E-- <--- 51 is the line number of the 3rd last one 
64:--38321e0f-H-- 
75:--38321e0f-Z-- 

Так что теперь удаление (т.е. подавление печати) строк 1-50 файла:

sed '1,50d' modsec_audit.log 
Смежные вопросы