首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如果下一个X行不包含特定字符串,则为grep

如果下一个X行不包含特定字符串,则为grep
EN

Stack Overflow用户
提问于 2018-04-04 10:12:32
回答 2查看 81关注 0票数 1

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

我想忽略一个警告,它包含从相关警告开始的6行后面的一个特定字符串。

挑战在于,因为每个警告都由几个单独的行组成,而不是一个长的行。

有什么推荐的方法吗?

例如,日志:

代码语言:javascript
运行
AI代码解释
复制
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“的所有警告,以便输出如下:

代码语言:javascript
运行
AI代码解释
复制
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:)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-04 10:58:55

代码语言:javascript
运行
AI代码解释
复制
$ cat tst.awk
/^[0-9]/ { prt() }
{ rec = rec $0 ORS }
END { prt() }
function prt() {
    if ( (rec ~ /WARN/) && (rec !~ /EAgent/) ) {
        printf "%s", rec
    }
    rec = ""
}

代码语言:javascript
运行
AI代码解释
复制
$ 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:)

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

代码语言:javascript
运行
AI代码解释
复制
/^[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 = ""
}
票数 2
EN

Stack Overflow用户

发布于 2018-04-04 10:56:39

请您试着跟踪awk,然后告诉我这是否对您有帮助?

代码语言:javascript
运行
AI代码解释
复制
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

这里也加入了一种非一元线性形式的解决方案。

代码语言:javascript
运行
AI代码解释
复制
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

解释:

代码语言:javascript
运行
AI代码解释
复制
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.
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49657736

复制
相关文章
Java中对map按key或val排序
Collections是一个工具类,sort是其中的静态方法,是用来对List类型进行排序的,它有两种参数形式:
sunonzj
2022/06/21
1.6K0
int a; int* a; int** a; int (*a)[]; int (*a)(int)
a) int a;表示一个内存空间,这个空间用来存放一个整数(int); b) int* a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放整数的空间,即a)中提到的空间; c) int** a;表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个存放指针的空间,并且指向的这个空间中的指针,指向一个整数。也简单的说,指向了一个b)中提到的空间; d) int (*a)[4];表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个长度为4、类型为int的数组;和int** a的区别在于,++、+=1之后的结果不一样,其他用法基本相同。 以上四种类型见上图表示。 e) int (*a)(int);表示一个内存空间,这个空间用来存放一个指针,这个指针指向一个函数,这个函数有一个类型为int的参数,并且函数的返回类型也是int。
Twcat_tree
2022/11/30
2.3K0
int a; int* a; int** a; int (*a)[]; int (*a)(int)
lombok的val
今天遇到一个情况,我们知道把java代码粘贴到kt文件里,idea会自动转换java为kt
阿超
2023/02/22
9630
lombok的val
listnode.val java(string indexof方法)
有一列 1.给出 Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) 要求 Output: 7 -> 0 -> 8
全栈程序员站长
2022/08/01
6450
Train / Val / Test划分
合理的Train/Test集划分会有效地减少under-fitting和over-fitting现象
mathor
2020/01/15
2.2K0
VBA专题:Val函数
Val函数返回作为参数传递的字符串中的前导数字,它在无法识别为数字部分的第一个字符处停止读取字符串,但它不会在空格处停止。
fanjy
2022/11/16
1.5K0
jquery的html,text,val
.html()用为读取和修改元素的HTML标签 .text()用来读取或修改元素的纯文本内容 .val()用来读取或修改表单元素的value值。 这三个方法功能上的对比 .html(),.text(),.val()三种方法都是用来读取选定元素的内容;只不过.html()是用来读取元素的HTML内容(包括其Html标签),.text()用来读取元素的纯文本内容,包括其后代元素,.val()是用来读取表单元素的"value"值。其中.和.text()方法不能使用在表单元素上,而.val()只能使用在表单元素上;
marsggbo
2018/01/23
2K0
jquery的html,text,val
    1.html()用为读取和修改元素的HTML标签     2.text()用来读取或修改元素的纯文本内容     3.val()用来读取或修改表单元素的value值。
ydymz
2018/09/10
1.6K0
int(*p)[4] int*p[4]
1、int(*p)[4];------p为指向含4个元素的一维整形数组的指针变量(是指针) #include <stdio.h> #include <stdlib.h> int main() { int a[4]={1,2,3,4}; int (*p)[4]; p=&a; printf("%d\n",(*p)[3]); printf("%d\n",*p); return 0; } 2、int *p[4];-------定义指针数组p,它由4个指向整型数据的
谙忆
2021/01/19
2K0
java中string转换为int(int char)
// String change int public static void main(String[] args) { String str = “123”; int n; // first method // n = Integer.parseInt(str); n = 0; n = Integer.parseInt(str); System.out.println(“Integer.parseInt(str):”+ n); System.out.println(“\n”); //second method //n = Integer.valueOf(str).intValue();
全栈程序员站长
2022/07/28
1.9K0
java中string转换为int(int char)
JAVA将string转化为int(int怎么转string)
1). int i = Integer.parseInt([String]); 或
全栈程序员站长
2022/07/28
3K0
C# int int16 Int32 Int64的介绍[通俗易懂]
今天看到别人的代码中用到Int32,UInt32相关,想到自己平时用的都是int类型整数,就心生好奇的翻了一下资料:
全栈程序员站长
2022/09/21
3.6K0
.net Int16 、(int Int32)、 Int64 的区别
摘要: 关于什么是16位整数,32位整数,64位整数,请看这里:http://www.cnblogs.com/EasonJim/p/4837061.html Int16 值类型表示值介于 -32768 到 +32767 之间的有符号整数。
拓荒者
2019/03/14
2.7K0
int是什么_int a[4][4]
Int16 意思是16位整数(16bit integer),相当于short 占2个字节 -32768 ~ 32767
全栈程序员站长
2022/09/21
1.4K0
聊聊kotlin的val跟var
val:英文读value,代表是immutable, 只读的意思 比如下面这个kotlin代码
韦东锏
2021/09/29
1.2K0
聊聊kotlin的val跟var
2022-05-26:void add(int L, int R, int C)代表在arr[L...R]上每个数加C, int get(int L, int
2022-05-26:void add(int L, int R, int C)代表在arrL...R上每个数加C,
福大大架构师每日一题
2022/05/26
1.5K0
2022-05-26:void add(int L, int R, int C)代表在arr[L...R]上每个数加C, int get(int L, int
#define a int[10]与 typedef int a[10]用法
// #define a int[10] #include <stdio.h> #include <stdlib.h> #define a int[10] int main() { int *p=(int *)malloc(sizeof(a)); p[0]=1; printf("%d\n",p[0]); return 0; } // typedef int a[10]; #include <stdio.h> typedef int a[10]; int m
Daotin
2018/08/31
1.6K0
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)[转]include <stdio.h>int func(int a, int b, int c, int d, int e,
声明:本文转自Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码),此文干货很多。
用户2930595
2018/08/23
4.2K0
Android逆向之旅---动态方式破解apk进阶篇(IDA调试so源码)[转]include <stdio.h>int func(int a, int b, int c, int d, int e,
JAVA 枚举 String-int
/** * @author 姜兴琪 */ package cn.bycs.online.dealer.vo; /** * @author jiangxingqi * 车辆状态枚举 */ public enum NewCarStatusEnum { DRAFT("草稿",1), SUBMIT_RELEASE("提交发布",2), PUBLISH_SUCCESS("发布成功",3), AUDIT_DENY("审核不通过",4); private St
week
2018/08/27
3440
点击加载更多

相似问题

基本Regex需要帮助

15

需要Python Regex帮助(基本)

42

需要C语言的基本帮助

26

需要帮助来完成连接

10

需要帮助理解基本递归问题

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档