来自于《计算机教育中缺失的一课》04
将字符中a或者b抹除(替换为空字符),并输出
echo 'abcaba' | sed -E 's/[ab]//'
输出结果:bcaba
以上,正则只匹配一次,要多次匹配,在后面加g
echo 'abcaba' | sed -E 's/[ab]//g'
输出结果:c
有些指令并并不会生效,比如
echo 'abcaba' | sed 's/(ab)*//g'
输出结果:abcaba
我们需要添加参数E,使其支持更新的语法
echo 'abcaba' | sed -E 's/(ab)*//g'
输出结果:ca
或者通过转义符,告诉程序括号为括号
echo 'abcaba' | sed 's/\(ab\)*//g'
输出结果:ca
匹配后是即时删除的,比如
echo 'abcababc' | sed -E 's/(ab|bc)*//g'
输出结果:cc
[在线正则网站]https://regex101.com/
vim 进入api-controller.log后,使用 ":%s + 正则" 的方式可能查找不出来,或许跟行匹配有关
暂时没有找到原因
读取日志
cat api-controller.log
过滤关键字,此时管道中的数据是按行输出,为之后的正则匹配提供了条件
grep '源文件路径'
对过滤出的每一行日志按正则过滤,并按组输出(起始组:1)
sed -E 's/^.*\[([0-9a-z]{32})\]: .*:(esus.*pdf)$/\2/'
其中 "\2" 表示第二组,正则中的小括号表示结果分组
打印组数据
awk '{print $0}'
以数据源为例:
2023-05-24 16:49:03.565 INFO [http-nio-9001-exec-6] [c.b.c.s.w.c.DeleteSourceAspect_after:123] - [a9f3e9082bef43519c5d1917092d61ba]: 源文件路.:esus/web/2023/5/24/f8f79256991e27cbad615e406d9fd499439fbd044adf02cc4b183c9e0f39b23fgdfileflag82b-4433-837d-d14d5451.pdf
查询链路ID:
cat api-controller.log | grep '源文件路径' | sed -E 's/^.*\[([0-9a-z]{32})\]: .*:(esus.*pdf)$/\1/' | awk '{print $1}'
输出为:a9f3e9082bef43519c5d1917092d61ba
查询文件路径:
cat api-controller.log | grep '源文件路径' | sed -E 's/^.*\[([0-9a-z]{32})\]: .*:(esus.*pdf)$/\2/' | awk '{print $1}'
输出为:esus/web/2023/5/24/f8f79256991e27cbad615e406d9fd499439fbd044adf02cc4b183c9e0f39b23fgdfileflag82b-4433-837d-d14d5451.pdf
更多参考:[数据整理] https://missing-semester-cn.github.io/2020/data-wrangling/