如何获取modsec_audit.log文件的最后X条记录?
How to get last X records of the modsec_audit.log file?
我需要获取 bash 中 modsec_audit.log 文件的最后 X 条记录,并将其写入新文件。我知道这可以通过 tail 和 sed 实现,但这可能会在某一行被截断并导致一半的消息留在开头。
有没有更清洁的方法来做到这一点?我只需要从日志文件中获取 X last events/items。
对于那些不熟悉 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--
使用 awk 和 tac 进行一些黑客攻击
从宽大的尾巴开始,反转,打印前 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
是定义变量的可选标签。
另一种选择可能是这样的... 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
我需要获取 bash 中 modsec_audit.log 文件的最后 X 条记录,并将其写入新文件。我知道这可以通过 tail 和 sed 实现,但这可能会在某一行被截断并导致一半的消息留在开头。
有没有更清洁的方法来做到这一点?我只需要从日志文件中获取 X last events/items。
对于那些不熟悉 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--
使用 awk 和 tac 进行一些黑客攻击
从宽大的尾巴开始,反转,打印前 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
是定义变量的可选标签。
另一种选择可能是这样的... 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