目录
- 一. 查询两个文件第一列的数据并去重
- 二. 抽取日志中指定的字段
- 三. 服务器指定时间点异常查询
- 四. 从csv文件中抽取指定的数据
- 五. 获取除了空白行和注释之外的部分
一. 查询两个文件第一列的数据并去重
📚file1.log
123 aaa 你好
345 bbb 我好
345 ccc 大家好
124 ddd 世界好
111 rrr 哈哈哈
📚file2.log
123 mmm 你好mmm
366 nnn 我好nnn
377 fff 大家好fff
124 uuu 世界好uuu
111 iii 哈哈哈iii
🤔分析
两个文本文件格式相同,都是3列,第一例都是数字编号。可以通过打开这两个文件然后获取出开头列,然后排序之后再去重。
🧐转换为linux命令之后就是
- 通过cat命令同时打开两个文本文件
-o
配置项只输出匹配到的内容^\S*
匹配开头不为空的内容sort
用来排序uniq
用来去重
cat file1.log file2.log | egrep -o -a "^\S*" | sort | uniq
111
123
124
345
366
377
👉如果我们想查看每个数字编码出现的次数的话,给uniq
命令加上-c
配置项即可。
其中第一列是数字编码出现的次数。
cat file1.log file2.log | egrep -o -a "^\S*" | sort | uniq -c
2 111
1 123
2 124
2 345
1 366
1 377
二. 抽取日志中指定的字段
📚有如下日志file4.log
- 日志分内容分为2类,SEQIN 和 SEQOUT
- SEQIN 类中存在若干字段内容,isuuePayId,uuid,jmw_state,method等等
2323 SEQIN mmm isuuePayId=5768awe uuid=woenoo; jmw_state=success method=paypay info=ppp
2323 SEQOUT COST=45726
2345 SEQIN mmm isuuePayId=34895ry uuid=;ljkler jmw_state=faile method=alipay info=ddd
2345 SEQOUT COST=34855
🤪需求,抽取出SEQIN类日志中的第一个字段,isuuePayId 和 jmw_state 字段,让其在一行显示
⏹第一步,抽取SEQIN类日志,去除掉 SEQOUT 日志
grep -a "SEQIN" file4.log
2323 SEQIN mmm isuuePayId=5768awe uuid=woenoo; jmw_state=success method=paypay info=ppp
2345 SEQIN mmm isuuePayId=34895ry uuid=;ljkler jmw_state=faile method=alipay info=ddd
⏹第二步,获取出SEQIN类日志中的第一个字段,isuuePayId 和 jmw_state 字段
grep -a "SEQIN" file4.log | egrep -o -a -e "^\S*" -e "isuuePayId=\S*" -e "jmw_state=\S*"
2323
isuuePayId=5768awe
jmw_state=success
2345
isuuePayId=34895ry
jmw_state=faile
⏹第三步,让isuuePayId和jmw_state到一行上显示
grep -a "SEQIN" file4.log
# 进一步过滤
| egrep -o -a -e "^\S*" -e "isuuePayId=\S*" -e "jmw_state=\S*"
# 替换指定字段的换行符
| sed ':loop; N; $!b loop; ;s/\n\([ij]\)/ \1/g'
2323 isuuePayId=5768awe jmw_state=success
2345 isuuePayId=34895ry jmw_state=faile
三. 服务器指定时间点异常查询
- 需求:由于上午发生网络波动,导致部分业务发生了异常
- 现在需要查询出网络波动时间点和异常的件数
- 哪个服务器发生的异常
- 具体发生了什么的异常
⏹查询发生的件数版本1
- 以ERROR 或 Exception 为关键词进行检索
c1A03a,c1Ae*a,c1Be*a
都是服务器的名称- 同一个请求可能会发生多个异常,因此这种查询方式得到的件数可能会存在重复
grep -ae "\[ERROR\]" -ae "Exception" /logback/{c1A03a,c1Ae*a,c1Be*a}/tomcat/current/logs/
spl/.20240331*mpl*app.log | wc -l
⏹查询发生的件数版本2
grep -ae "\[ERROR\]" -ae "Exception" /logback/{c1A03a,c1Ae*a,c1Be*a}/tomcat/current/logs/
spl/.20240331*mpl*app.log | grep -a 09:0[5-9]:[0-5][0-9] | egrep -o "^\S*" | sort
| uniq -c | wc -l
⏹查询发生异常的服务器名称
- 根据时间点缩小范围
- 查询开头不为空的部分(含有日志路径和线程号部分)
- 排序之后去重
- 之所以会用
awk '{print $1}'
是因为排序之后去重之后,获取到的内容之前会加上一个数字,用来表示当前行的重复数量 - 若仅排序去重,不使用
awk '{print $1}'
处理,数据的大致样式如下1 /logback/c1Ae01a/tomcat/current/logs/spl/.2024033109mpl_test1_app.log:03210429-47789 5 /logback/c1Ae12a/tomcat/current/logs/spl/.2024033109mpl_test2_app.log:03210154-24389 3 /logback/c1Be07a/tomcat/current/logs/spl/.2024033109mpl_bis01_app.log:06334561-95267
- 将查询结果放入result.log文件中
grep -ae "\[ERROR\]" -ae "Exception" /logback/{c1A03a,c1Ae*a,c1Be*a}/tomcat/current/logs/
spl/.20240331*mpl*app.log | grep -a 09:0[5-9]:[0-5][0-9] | egrep -o "^\S*" | sort
| uniq -c | awk '{print $1}' > result.log
⏹result.log的内容如下
:
之前的部分是日志所在的路径,从路径中可以找出服务器的名称:
之后的部分是请求的线程号,通过该线程号可以详细的抽出日志
/logback/c1Ae01a/tomcat/current/logs/spl/.2024033109mpl_test1_app.log:03210429-47789
/logback/c1Ae12a/tomcat/current/logs/spl/.2024033109mpl_test2_app.log:03210154-24389
/logback/c1Be07a/tomcat/current/logs/spl/.2024033109mpl_bis01_app.log:06334561-95267
四. 从csv文件中抽取指定的数据
⏹sftp_data.csv
AAA,222,333,20240604,20
AAA,222,333,20240604,10
BBB,444PPP,555SS,20240605,20
BBB,444,555SS,20240610,20
CCC,555,666SS,20240605,10
CCC,666,666SS,20240603,20
🤔需要从上面的csv文件中抽取
- 第四列的从
20240601~20240605
的数据 - 第五列为
20
的数据
⏹grep "^.*,.*,.*,2024060[1-5],20" sftp_data.csv
- 前3列为任意值
- 后两列指定正则表达式和具体的值
fengyehong@ubuntu:~/jmw_work_space/20270720$ grep "^.*,.*,.*,2024060[1-5],20" sftp_data.csv
AAA,222,333,20240604,20
BBB,444PPP,555SS,20240605,20
CCC,666,666SS,20240603,20
五. 获取除了空白行和注释之外的部分
cat file3.txt | grep -v ^# | grep -v ^$