当前位置: 首页 > news >正文

Linux grep技巧 提取log中的json数据

目录

  • 一. 前提
    • 1.1 数据准备
    • 1.2 需求
    • 1.3 分析
  • 二. 数据提取
    • 2.1 提取所有的json数据
    • 2.2 提取子项目的全部json数据
    • 2.3 提取指定项目的json数据


一. 前提

1.1 数据准备

545-1 2024/07/20 18:20:21 [ERROR] MPX001 eventController=aupay transactionId=A545 {"event":"ERROR","auid":"kddi_XXXasd1","category":{"id":"110","name":"APPLE 1","amout":10,"price":12}}
545-2 2024/07/20 18:20:22 [INFO] MPX001 eventController=alipay transactionId=Bljk {"event":"INFO","auid":"kddi_XXXasd2","category":{"id":"111","name":"APPLE 2","amout":11,"price":13}}
545-3 2024/07/20 18:20:23 [ERROR] MPX001 eventController=paypay transactionId=Ijkhjk {"event":"ERROR","auid":"kddi_XXXasd3","category":{"id":"112","name":"APPLE 3","amout":12,"price":14}}
545-4 2024/07/20 18:20:24 [INFO] MPX001 eventController=alipay transactionId=C9joj {"event":"INFO","auid":"kddi_XXXasd4","category":{"id":"113","name":"APPLE 4","amout":13,"price":15}}

1.2 需求

  • 从log中提取出[ERROR]相关的日志
  • 然后再从日志中进一步提取eventControllertransactionId,JSON数据中的auidname
  • 服务器中没有安装jq库,无法通过此种方式来处理json数据。

1.3 分析

  • ①先提取[ERROR]相关的日志,过滤掉INFO的日志
  • ②再提取出eventControllertransactionId字段
  • ③然后可以先尝试提取出所有的json数据
    • 使用{.*}正则表达式
  • ④然后可以进一步缩小范围,提取category相关的json数据
    • 使用"category":{.*}正则表达式
  • ⑤然后可以进一步提取auidname所对应的值
    • auid":"[^"]*"
    • name":"[^"]*"
  • ⑥最后再通过sed命令将各字段转置到一行上
    • sed ':loop; N; $!b loop; ;s/\n\([tan]\)/ \1/g'

二. 数据提取

2.1 提取所有的json数据

  • {.*}
grep -E "\[ERROR\]\sMPX001" ./result.log | \
grep -o -e "eventController=\S*" -e "transactionId=\S*" -e "{.*}" | \
sed ':loop; N; $!b loop; ;s/\n\([t{]\)/ \1/g'

⏹效果如下

fengyehong@ubuntu:~/jmw_work_space/20270720$ grep -E "\[ERROR\]\sMPX001" ./result.log | \
> grep -o -e "eventController=\S*" -e "transactionId=\S*" -e "{.*}" | \
> sed ':loop; N; $!b loop; ;s/\n\([t{]\)/ \1/g'eventController=aupay transactionId=A545 {"event":"ERROR","auid":"kddi_XXXasd1","category":{"id":"110","name":"APPLE 1","amout":10,"price":12}}
eventController=paypay transactionId=Ijkhjk {"event":"ERROR","auid":"kddi_XXXasd3","category":{"id":"112","name":"APPLE 3","amout":12,"price":14}}

2.2 提取子项目的全部json数据

  • "category":{.*}
grep -E "\[ERROR\]\sMPX001" ./result.log | \
grep -o -e "eventController=\S*" -e "transactionId=\S*" -e '"category":{.*}' | \
sed ':loop; N; $!b loop; ;s/\n\([t"]\)/ \1/g'

⏹效果如下

fengyehong@ubuntu:~/jmw_work_space/20270720$ grep -E "\[ERROR\]\sMPX001" ./result.log | \
> grep -o -e "eventController=\S*" -e "transactionId=\S*" -e '"category":{.*}' | \
> sed ':loop; N; $!b loop; ;s/\n\([t"]\)/ \1/g'eventController=aupay transactionId=A545 "category":{"id":"110","name":"APPLE 1","amout":10,"price":12}}
eventController=paypay transactionId=Ijkhjk "category":{"id":"112","name":"APPLE 3","amout":12,"price":14}}

2.3 提取指定项目的json数据

  • auid":"[^"]*"
  • name":"[^"]*"
    • []:定义一个字符类。
    • ^:在字符类中表示否定,意味着字符类匹配所有不在括号内的字符。
    • ":字符类中唯一被否定的字符。
    • *:表示前面的模式(即 [^"])可以出现零次或多次。

因此,[^"]* 表示匹配由任意数量的非双引号字符组成的字符串,包括零个字符的情况。

grep -E "\[ERROR\]\sMPX001" ./result.log | \
grep -o -e "eventController=\S*" -e "transactionId=\S*" -e 'auid":"[^"]*"' -e 'name":"[^"]*"' | \
sed ':loop; N; $!b loop; ;s/\n\([tan]\)/ \1/g'

⏹效果如下

fengyehong@ubuntu:~/jmw_work_space/20270720$ grep -E "\[ERROR\]\sMPX001" ./result.log | \
> grep -o -e "eventController=\S*" -e "transactionId=\S*" -e 'auid":"[^"]*"' -e 'name":"[^"]*"' | \
> sed ':loop; N; $!b loop; ;s/\n\([tan]\)/ \1/g'eventController=aupay transactionId=A545 auid":"kddi_XXXasd1" name":"APPLE 1"
eventController=paypay transactionId=Ijkhjk auid":"kddi_XXXasd3" name":"APPLE 3"

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • MySQL第四次作业
  • Try ubuntu core (by quqi99)
  • leetcode日记(48)排列序列
  • Harmony Next -- 通用标题栏:高度自定义,可设置沉浸式状态,正常状态下为:左侧返回、居中标题,左中右均可自定义视图。
  • 「运费速查神器」精明买家必备!一键查询1688供应商发货费用
  • 白骑士的PyCharm教学基础篇 1.2 PyCharm基本操作
  • VMware三种网络模式---巨细
  • Linux下如何使用GitLab进行团队协作
  • ES6 数值的扩展(十八)
  • 【MySQL】:对库和表的基本操作方法
  • 33.【C语言】实践扫雷游戏
  • WEB安全-SQL注入
  • 鸿蒙语言基础类库:【@system.vibrator (振动)】
  • 【Langchain大语言模型开发教程】记忆
  • electron学习笔记
  • 【Linux系统编程】快速查找errno错误码信息
  • 【翻译】babel对TC39装饰器草案的实现
  • 4. 路由到控制器 - Laravel从零开始教程
  • canvas 五子棋游戏
  • es的写入过程
  • Hexo+码云+git快速搭建免费的静态Blog
  • JavaScript对象详解
  • javascript数组去重/查找/插入/删除
  • java中的hashCode
  • js算法-归并排序(merge_sort)
  • node入门
  • opencv python Meanshift 和 Camshift
  • vue 个人积累(使用工具,组件)
  • Vue学习第二天
  • Webpack 4x 之路 ( 四 )
  • 聊聊sentinel的DegradeSlot
  • 面试总结JavaScript篇
  • 国内开源镜像站点
  • ###C语言程序设计-----C语言学习(3)#
  • #HarmonyOS:Web组件的使用
  • #宝哥教你#查看jquery绑定的事件函数
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (2)Java 简介
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (回溯) LeetCode 78. 子集
  • (算法)Travel Information Center
  • (算法)硬币问题
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)shell调试方法
  • (转)清华学霸演讲稿:永远不要说你已经尽力了
  • .NET Standard / dotnet-core / net472 —— .NET 究竟应该如何大小写?
  • .NET 程序如何获取图片的宽高(框架自带多种方法的不同性能)
  • .netcore如何运行环境安装到Linux服务器
  • .NET开发者必备的11款免费工具
  • .pub是什么文件_Rust 模块和文件 - 「译」
  • @Transient注解
  • [ 手记 ] 关于tomcat开机启动设置问题
  • [<事务专题>]