我创建了一个cron作业,每隔几分钟运行一次,并在日志文件上执行"grep“以查找警告。
我想忽略一个警告,它包含从相关警告开始的6行后面的一个特定字符串。
挑战在于,因为每个警告都由几个单独的行组成,而不是一个长的行。
有什么推荐的方法吗?
例如,日志:
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:)
我的grep:grep -A6 -ne 'Connection leak detection' -ne WARN myfile.log
我想忽略包含"EAgent“的所有警告,以便输出如下:
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:)
发布于 2018-04-04 10:58:55
$ 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:)
如果执行速度有问题,这应该稍微快一点:
/^[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 = ""
}
发布于 2018-04-04 10:56:39
请您试着跟踪awk
,然后告诉我这是否对您有帮助?
awk '/^[0-9]+/{if(val && !non_flag){print val};non_flag=val=""} /EAgent/ || /DEBUG not-relevant/{non_flag=1} {val=val?val ORS $0:$0} END{if(val && !non_flag){print val}}' Input_file
这里也加入了一种非一元线性形式的解决方案。
awk '
/^[0-9]+/{
if(val && !non_flag){
print val};
non_flag=val=""}
/EAgent/ || /DEBUG not-relevant/{
non_flag=1}
{
val=val?val ORS $0:$0
}
END{
if(val && !non_flag){
print val}
}
' Input_file
解释:
awk '
/^[0-9]+/{ ##Checking condition here if a line starts with digits then do following.
if(val && !non_flag){ ##Checking if variable val is NOT NULL and variable non_flag is NULL then do following.
print val}; ##Printing variable val here.
non_flag=val=""} ##Nullifying the value of variable non_flag and val here.
/EAgent/ || /DEBUG not-relevant/{ ##Searching for strings EAgent OR DEBUG not-relevent in a line if either of them found do following
non_flag=1} ##Set variable non_flag value to 1 here.
{
val=val?val ORS $0:$0 ##Creating variable val whose value is current line and it concatenates its own value with it.
}
END{ ##Starting END block of awk here.
if(val && !non_flag){ ##Checking condition if variable val is NOT NULL and variable non_flag is NULL then do following.
print val} ##Printing the variable val here.
}
' Input_file ##Mentioning Input_file name here.
https://stackoverflow.com/questions/49657736
复制