grep如果下一个X行不包含特定的字符串 [英] grep if the next X lines doesn't contain a specific string

查看:212
本文介绍了grep如果下一个X行不包含特定的字符串的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我创建了一个每隔几分钟运行一次的cron作业,并在日志文件上执行grep以查找警告。

我想忽略包含6之后特定字符串的警告从相关的警告开始的行。

挑战是因为每个警告包括几个单独的行,而不是一个长行。

有没有建议的方式来做到这一点? / p>

记录例如:

  2018-04-04 05:15 :13,576 [housekeeper]调试不相关... 
2018-04-04 05:16:19,226 [管家]调试不相关...
2018-04-04 05:45:28,383 [管家] WARN com.zaxxer.hikari.pool.ProxyLeakTask - 为com.mysql.jdbc.JDBC4Connection@2f350071触发连接泄漏检测,堆栈跟踪如下
java.lang.Exception:检测到明显连接泄漏
at com.sql.HikariConnectionPool.getConnection(java :)
at com.DBConnection.getConn(java :)
at com.DBConnection.getConn(java :)
at com.EAgent.checkER(aaa.java :)
at com.EAgent $ EExecuter.run(aaa.java :)
2018-04-04 05:55:54,425 [housekeeper] DEBUG not-相关...
2018-04-04 05:58:16,814 [DBPool管家] WARN com.zaxxer.hikari.pool.ProxyLeakTask - 为com.mysql.jdbc.JDBC4Connection@45df031触发连接泄漏检测,堆栈跟踪如下
java.lang.Exception:在com.HikariConnectionPool.getConnection(HikariConnectionPool.java :)检测到
的明显连接泄漏。com在com.DBConnection.getConn(aaa.java)$ b $处检测到
b at com.DBConnection.getConn(aaa.java :)
at com.m.checkUC(aaa.java :)
at com.m.run(aaa.java :)
at java.c.ThreadPoolExecutor.runWorker(aaa.java :)在java.c.ThreadPoolExecutor中
$ Worker.run(aaa.java :) $ b $在java.lang.Thread.run(aaa.java: )

我的grep: grep -A6 -ne'连接泄漏检测' - ne WARN myfile.log



我想忽略所有包含E代理,以便输出结果为:

  2018-04-04 05:58:16,814 [DBPool housekeeper] WARN com .zaxxer.hikari.pool.ProxyLeakTask  - 为com.mysql.jdbc.JDBC4Connection@45df031触发连接泄漏检测,堆栈跟踪跟在
后java.lang.Exception:在com.HikariConnectionPool处检测到
的明显连接泄漏。 getConnection(HikariConnectionPool.java :)
at com.DBConnection.getConn(aaa.java :)
at com.DBConnection.getConn(aaa.java :)
at com.m.checkUC( aaa.java :)
at com.m.run(aaa.java :)
at java.c.ThreadPoolExecutor.runWorker(aaa.java :)
at java.c.ThreadPoolExecutor $ Worker.run(aaa.java)$ b $在java.lang.Thread.run(aaa.java :)


<

END {prt()}
函数prt(){
if((rec〜/ WARN /)&& (rec!〜/ EAgent /)){
printf%s,rec
}
rec =
}



  $ awk -f tst.awk文件
2018-04-04 05:58:16,814 [DBPool管家] WARN com.zaxxer.hikari.pool.ProxyLeakTask - 为com.mysql.jdbc.JDBC4Connection@45df031触发连接泄漏检测,堆栈跟踪如下
java.lang.Exception:显式连接泄漏检测
在com.HikariConnectionPool.getConnection(HikariConnectionPool.java :)
在com.DBConnection.getConn(aaa.java :)
at com .DBConnection.getConn(aaa.java)$ b $ com.m.checkUC(aaa.java :)
at com.m.run(aaa.java :)
at java.c .ThreadPoolExecutor.runWorker(aaa.java :)在java.c.ThreadPoolExecutor上
$ Worker.run(aaa.java :) $ b $在java.lang.Thread.run(aaa.java :)

如果执行速度有问题,应该稍微快一点:

  / ^ [0-9] / {
if(inWarn){
prt()
}
inWarn = / WARN /
}
inWarn {rec = rec $ 0 ORS}
END {if(inWarn)prt()}
函数prt(){
if(rec!〜/ EAgent /){
printf%s,rec
}
rec =
}


I created a cron job that runs every few minutes and performs "grep" on a log file in order to find warnings.
I'd like to ignore a warning which containing a specific string after 6 lines from the beginning of the relevant warning.
The challenge is since each warning consists of several separate lines rather than one long line.
Is there any recommended way to do that?

Log for example:

2018-04-04 05:15:13,576 [housekeeper] DEBUG not-relevant...
2018-04-04 05:16:19,226 [housekeeper] DEBUG not-relevant...
2018-04-04 05:45:28,383 [housekeeper] WARN  com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@2f350071, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at com.sql.HikariConnectionPool.getConnection(java:)
    at com.DBConnection.getConn(java:)
    at com.DBConnection.getConn(java:)
    at com.EAgent.checkER(aaa.java:)
    at com.EAgent$EExecuter.run(aaa.java:)
2018-04-04 05:55:54,425 [housekeeper] DEBUG not-relevant...
2018-04-04 05:58:16,814 [DBPool housekeeper] WARN  com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@45df031, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at com.HikariConnectionPool.getConnection(HikariConnectionPool.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.m.checkUC(aaa.java:)
    at com.m.run(aaa.java:)
    at java.c.ThreadPoolExecutor.runWorker(aaa.java:)
    at java.c.ThreadPoolExecutor$Worker.run(aaa.java:)
    at java.lang.Thread.run(aaa.java:)

My grep:grep -A6 -ne 'Connection leak detection' -ne WARN myfile.log

I want to ignore all the warnings which containing "EAgent", so that the output will be:

2018-04-04 05:58:16,814 [DBPool housekeeper] WARN  com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@45df031, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at com.HikariConnectionPool.getConnection(HikariConnectionPool.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.m.checkUC(aaa.java:)
    at com.m.run(aaa.java:)
    at java.c.ThreadPoolExecutor.runWorker(aaa.java:)
    at java.c.ThreadPoolExecutor$Worker.run(aaa.java:)
    at java.lang.Thread.run(aaa.java:)

解决方案

$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }
function prt() {
    if ( (rec ~ /WARN/) && (rec !~ /EAgent/) ) {
        printf "%s", rec
    }
    rec = ""
}

.

$ awk -f tst.awk file
2018-04-04 05:58:16,814 [DBPool housekeeper] WARN  com.zaxxer.hikari.pool.ProxyLeakTask - Connection leak detection triggered for com.mysql.jdbc.JDBC4Connection@45df031, stack trace follows
java.lang.Exception: Apparent connection leak detected
    at com.HikariConnectionPool.getConnection(HikariConnectionPool.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.DBConnection.getConn(aaa.java:)
    at com.m.checkUC(aaa.java:)
    at com.m.run(aaa.java:)
    at java.c.ThreadPoolExecutor.runWorker(aaa.java:)
    at java.c.ThreadPoolExecutor$Worker.run(aaa.java:)
    at java.lang.Thread.run(aaa.java:)

If speed of execution is an issue, this should be slightly faster:

/^[0-9]/ {
    if (inWarn) {
        prt()
    }
    inWarn = /WARN/
}
inWarn { rec = rec $0 ORS }
END { if (inWarn) prt() }
function prt() {
    if ( rec !~ /EAgent/ ) {
        printf "%s", rec
    }
    rec = ""
}

这篇关于grep如果下一个X行不包含特定的字符串的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆