我需要分析apache server-status的输出。我需要匹配“#34;发送回复”#34;解析stastic页面。内容如下所示:
11-1 24986 7/9/7288 K 0.08 3 1 77.5 0.08 23.17 IP-CLIENT
hostname:80 GET /static/img/securoty.png HTTP/1.1
12-1 23648 65/108/8176 K 5.74 2 51 90.6 0.16 24.50 IP-CLIENT
hostname:80 POST /php/toolbar_ajax.php HTTP/1.1
13-1 22887 95/118/7672 K 5.38 2 47 140.5 0.17 18.65 IP-CLIENT
hostname:80 POST /php/toolbar_ajax.php HTTP/1.1
14-1 24987 4/6/8016 K 0.09 4 379 288.5 0.28 22.42 IP-CLIENT
hostname:80 GET /static/img/bg_dealers.jpg HTTP/1.1
15-1 24518 7/43/8425 K 2.36 4 53 10.2 0.18 23.24 IP-CLIENT
hostname:80 POST /php/toolbar_ajax.php HTTP/1.1
40-3 12970 14/27/5335 W 10.37 0 0 26.7 0.05 18.44 IP-CLIENT
hostname:80 GET /php/r_fin_new3_std.php HTTP/1.1
每个奇数行都有这个传说:
__________________________________________________________________
Srv Child Server number - generation
PID OS process ID
Acc Number of accesses this connection / this child / this slot
M Mode of operation
CPU CPU usage, number of seconds
SS Seconds since beginning of most recent request
Req Milliseconds required to process most recent request
Conn Kilobytes transferred this connection
Child Megabytes transferred this child
Slot Total megabytes transferred this slot
__________________________________________________________________
每个偶数行都包含客户端询问的URL。 我需要匹配包含"操作模式"的每一行。在" W" (发送回复)和" SS" (自最近一次请求开始以来的秒数),然后是10.然后匹配这些行后,我需要打印出行和之后的行。 在这种情况下,我需要打印:
40-3 12970 14/27/5335 W 10.37 0 0 26.7 0.05 18.44 IP-CLIENT
hostname:80 GET /php/r_fin_new3_std.php HTTP/1.1
然后打印第一行和下一行,这会给我一个询问的URL。
我在日志文件中每隔5分钟保存(追加)服务器状态。 如果我使用这个命令,我会得到所有"发送回复"和之后的行,但不能过滤大于10的那些:
grep " W " -A 1 /var/log/server-status.log
有什么想法吗?
答案 0 :(得分:2)
hek2gml工作正常,让他为他+1:)
如果没有getline
,我会选择一些不同的东西:
awk 'line {print line; print; line=""} NF==11 && $4=="W" && $5 > 10 {line=$0}' file
返回:
40-3 12970 14/27/5335 W 10.37 0 0 26.7 0.05 18.44 IP-CLIENT
hostname:80 GET /php/r_fin_new3_std.php HTTP/1.1
即,继续检查线是否符合要求。如果是这样,请将其存储在line
变量中,以便在阅读下一行时将其与下一行一起打印。
更惯用的是,您可以使用123建议的内容:
awk 'NF==11 && $4=="W" && $5 > 10 {x=2} x && x--' file
即,在此条件匹配时设置计数器。从那一刻起,继续评估值value--
是否为True。每当发生这种情况时,awk
将打印当前行。最终它会打印当前行和下一行,因为我们从counter = 2开始。
在printing with sed or awk a line following a matching pattern中查找更多内容。
答案 1 :(得分:1)
您可以使用awk
:
awk 'NF==11 && $4=="W" && $5 > 10 {getline line; printf "%s\n%s\n", $0, line}'
我检查字段数为11的行,第4个字段设置为 W ,第5列的数值大于10.如果条件为真,我正在获得另一条线并打印当前线和该线。