bash:如果上一列高于< xxx'

时间:2015-11-30 09:32:17

标签: linux bash awk grep pattern-matching

我需要分析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
  • 第一行,第4栏(操作模式)是" W" = TRUE
  • 第一行,第5列(自最近请求开始以来的秒数)是10.37> 10 = TRUE

然后打印第一行和下一行,这会给我一个询问的URL。

我在日志文件中每隔5分钟保存(追加)服务器状态。 如果我使用这个命令,我会得到所有"发送回复"和之后的行,但不能过滤大于10的那些:

grep " W " -A 1 /var/log/server-status.log

有什么想法吗?

2 个答案:

答案 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.如果条件为真,我正在获得另一条线并打印当前线和该线。