Linux grep案例

目录

  • 一. 查询两个文件第一列的数据并去重
  • 二. 抽取日志中指定的字段
  • 三. 服务器指定时间点异常查询
  • 四. 从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 ^$

Linux grep案例_第1张图片

你可能感兴趣的:(Linux,linux)