Linux 从日志中抽取信息,批量生成SQL语句并执行

这里写目录标题

  • 一. 需求分析
  • 二. 从日志中抽取出指定字段,并切分为若干个子文件
  • 三. 生成查询执行计划
  • 四. 生成查询的SQL语句
  • 五. 检查并执行


一. 需求分析

有如下日志文件,假设日志文件中有10000条数据,要求将全部的TRANSACTIONID抽取出来,进行查询。

  • 可以使用grep -o将全部的TRANSACTIONID获取到,然后使用 WHERE 字段名 IN()的方式来获取。
  • 但是在SQL中,如果 IN()条件内的元素过多,会导致查询失败,一般最多为800个左右。
  • 我们可以将查询到的TRANSACTIONID分为若干个子文件,每个子文件内有800个元素,然后在通过Linux命令生成若干个SELECT语句,然后放到一个.sql文件中,最后通过SQL的命令行工具执行.sql语句,然后进行查询。

📄info.log

...省略若干条...
no=112 TRANSACTIONID=^ad342Uh result=2
no=345 TRANSACTIONID=tkafsjhg result=1
no=324 TRANSACTIONID=(eorg9er result=2
no=455 TRANSACTIONID=&woeihrd result=2
no=156 TRANSACTIONID=#woeif09 result=1
no=087 TRANSACTIONID=98IHzkje result=2
...省略若干条...

二. 从日志中抽取出指定字段,并切分为若干个子文件

  • grep -o "TRANSACTIONID=\S*":只把TRANSACTIONID字段抽取出来
  • sed -e 's/TRANSACTIONID=//g':把TRANSACTIONID去掉,只留下值
  • split -l 2 -d --additional-suffix=.txt - info_transactionId_
    • -l 2:表示将文件按照行分割, 每个分割出来的文件最多包含2行
    • -d:表示使用数字作为分割后的文件名后缀,而不是默认的字母后缀
    • --additional-suffix=.txt:指定切分后的文件名的后缀
    • -:表示从标准输入读取数据,充当占位符,表示从管道传递来的数据
    • info_transactionId_:表示切分后生成文件名的规则
  • \: 连接符,当命令行折行不在一行上的时候用 \来连接
cat info.log | grep -o "TRANSACTIONID=\S*" \
| sed -e 's/TRANSACTIONID=//g' \
| split -l 2 -d --additional-suffix=.txt - info_transactionId_

在这里插入图片描述


三. 生成查询执行计划

  • sed "s/$/'/; s/^/'/; s/$/,/;

    • s/$/'/;:对每一行的行尾($ 表示行尾)进行替换操作,将每行的行尾(即每行的最后一个字符)替换为单引号 。
    • s/^/'/;:对每一行的行首(^ 表示行首)进行替换操作,将每行的行首(即每行的第一个字符)替换为单引号 。
    • s/$/,/;:对每一行的行尾($ 表示行尾)进行替换操作,将每行的行尾(即每行的最后一个字符)替换为逗号 。
  • 1s/^/EXPLAIN PLAN FOR SELECT ...:对文本的第一行进行操作,在其首行(^ 表示行首)插入指定的内容

  • sed '$ s/.$/);/':在文本的最后一行的末尾删除最后一个字符,并添加上);

    • .表示最后一个字符
    • $表示行尾
# 创建存放查询执行计划的sql文件
touch create_explain.sql# 通过 echo 命令将sql写入文本文件
echo "/*表示形式设定*/
SET ECHO ON
SET PAGESIZE 1000
SET LINESIZE 1000/*error処理設定*/ 
define ERR_CD = 2whenever sqlerror exit &ERR_CD rollback;
whenever oserror exit &ERR_CD rollback;/*以下是SQL文部分*/
" > create_explain.sql# 读取transactionId文本内容,生成查询计划的SQL,写入文件
cat info_transactionId_00.txt | sed "s/$/'/; s/^/'/; s/$/,/; 1s/^/ \
EXPLAIN PLAN FOR SELECT COUNT(*) FROM PAY_TRAN WHERE TRAN_NO IN (\n/" | sed '$ s/.$/);/' >> create_explain.sqlecho "SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());
/* 查询计划到此为止 */
ROLLBACK;
exit" >> create_explain.sql

在这里插入图片描述
在这里插入图片描述


四. 生成查询的SQL语句

  • seq -f "%02g" 0 02:使用seq工具生成0到2的数字序列,%02g用来指定输出格式的选项,表示输出的数字用两位数的形式表示。
  • for tm in $(seq -f "%02g" 0 02); do cat info_transactionId_${tm} | ..... :依次打开切分后的所有info_transactionId_文件,将transactionId写入收到SQL的IN条件中。
# 创建查询SQL文件
touch create_exec.sqlecho "/*表示形式设定*/
SET ECHO ON
SET PAGESIZE 1000
SET LINESIZE 1000/*error処理設定*/ 
define ERR_CD = 2whenever sqlerror exit &ERR_CD rollback;
whenever oserror exit &ERR_CD rollback;/*以下是SQL文部分*/
" > create_explain.sql# 折行式写法
for tm in $(seq -f "%02g" 0 分隔后的文件的最大的ID); docat info_transactionId_${tm}.txt | sed "s/$/'/; s/^/'/; s/$/,/; 1s/^/ \SELECT COUNT(*) FROM table_name WHERE ID IN (\n/" | \sed '$ s/.$/);/' >> create_exec.sql
done# 非折行式写法,在本案例中分隔后的文件的最大的ID为 02
for tm in $(seq -f "%02g" 0 02); docat info_transactionId_${tm}.txt | sed "s/$/'/; s/^/'/; s/$/,/; 1s/^/SELECT COUNT(*) FROM table_name WHERE ID IN (\n/" | sed '$ s/.$/);/' >> create_exec.sql
doneecho "
/* 添加回滚语句 */
ROLLBACK;
exit" >> create_exec.sql

在这里插入图片描述
在这里插入图片描述


五. 检查并执行

这个命令使用了 SQL*Plus 工具来执行一个 SQL 脚本,并将执行结果输出到名为 result.log 的日志文件中。

  • 本案例中的数据库是ORACLE
  • sqlplus:启动 SQL*Plus 工具
  • ccuser/cc_user01@C2RDU1_CCPDB2:连接到 Oracle 数据库的凭据信息
    • ccuser:用户名
    • cc_user01:密码
    • C2RDU1_CCPDB2:要连接到的数据库
# 检查生成的SQL文,理论上生成的SQL没有错的话,grep文检索不到任何信息
grep $'\t' /sql文所在路径/*.sql
grep '	' /sql文所在路径/*.sql# 执行sql
sqlplus ccuser/cc_user01@C2RDU1_CCPDB2 @create_exec.sql > result.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2778927.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】多态语法概念

目录 一、概念及定义二、虚函数重写的特例三、final和override四、抽象类 一、概念及定义 概念:在继承关系下的不同类,调用同一个函数,产生不同的行为,叫作多态。 图示: 定义:必须通过基类的指针或者引…

【多模态大模型】Latent Diffusion:在潜在空间而非像素空间进行操作,从而减少了计算复杂度

Latent Diffusion Stable Diffusion 和 Latent Diffusion扩散模型的成本问题子问题1: 高计算成本和训练复杂度子问题2: 保持生成图像的视觉保真度子问题3: 实现多模态和高分辨率图像合成子问题4: 保持图像质量与细节Latent Diffusion 过程: 总结子问题/子解法1&…

实战案例:将已有的 MySQL8.0 单机架构变成主从复制架构

操作步骤 修改 master 主节点 的配置( server-id log-bin )master 主节点 完全备份( mysqldump )master 主节点 创建复制用户并授权master 主节点 将完全备份文件拷贝至从节点修改 slave 从节点 的配置( server-id rea…

代码随想录算法训练营第四十八天(动态规划篇之01背包)| 1049. 最后一块石头的重量Ⅱ,494. 目标和

1049. 最后一块石头的重量Ⅱ 题目链接:1049. 最后一块石头的重量 II - 力扣(LeetCode) 思路 尽量将石头分为重量相同的两堆,这样两堆中的石头相撞之后剩下的石头就会最小。根据之前的01背包理论: 代码随想录算法训…

svg基础(五)滤镜-高斯模糊,混合模式,偏移,颜色变换

1 作用 滤镜用于对SVG图形增加特殊效果 2 效果 feBlend - 与图像相结合的滤镜feColorMatrix - 用于彩色滤光片转换feComponentTransferfeCompositefeConvolveMatrixfeDiffuseLightingfeDisplacementMapfeFloodfeGaussianBlur 高斯模糊feImagefeMergefeMorphologyfeOffset - …

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表(略) 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删,删了会报错 2.3.3 引入spring web依赖…

[算法学习]

矩阵乘法 只有当左矩阵列数等于右矩阵行数,才能相乘N*M的矩阵和M*K的矩阵做乘法后矩阵大小为N*k矩阵乘法规则:第一个矩阵A的第 i 行与第二个矩阵的第 j 列的各M个元素对应相乘再相加得到新矩阵C[i][j]的值 整除 同余 同余的性质 线性运算,…

管理就是闭环

管理是什么?这个问题没有一个统一的答案。本文提供一个管中窥豹的答案:管理就是闭环。 作为基层管理者,日常管理事务,一个是目标闭环,一个是执行闭环。这分别对应敏捷PO和Scrum Master的职责。PO的职责是确保目标闭环&…

提升幸福感,中国的龙!理性看待个人发声——早读

打了过年球,爽! 引言代码第一篇 人民日报 【夜读】新的一年,提升幸福感的6件小事第二篇 茶百道的广告文第三篇 人民日报 热搜第一!《山河诗长安》,太燃了第四篇 人民日报 中国有真龙第五篇 人民日报 来啦 新闻早班车要…

Debezium发布历史122

原文地址: https://debezium.io/blog/2022/05/04/switch-to-java-11/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. Switching to Java 11/17 May 4, 2022 by Vojtěch Jurnek community news 你可…

初步探索Pyglet库:打造轻量级多媒体与游戏开发利器

目录 pyglet库 功能特点 安装和导入 安装 导入 基本代码框架 导入模块 创建窗口 创建控件 定义事件 运行应用 程序界面 运行结果 完整代码 标签控件 常用事件 窗口事件 鼠标事件 键盘事件 文本事件 其它场景 网页标签 音乐播放 图片显示 祝大家新…

【vscode】在vscode中如何导入自定义包

只需要额外添加这两条语句即可: import os,sys sys.path.append("../..") 需要注意的是,ipynb 文件打开的工作目录是文件本身的路径,而 py 文件打开的工作路径是 vscode 打开的路径。 相比较而言 pycharm 中创建好项目之后并不…

ubuntu20.04 安装mysql(8.x)

安装mysql命令 sudo apt-get install mysql-server安装完毕后,立即初始化密码 sudo mysql -u root # 初次进入终端无需密码ALTER USER rootlocalhost IDENTIFIED WITH caching_sha2_password BY yourpasswd; # 设置本地root密码设置mysql远程登录 设置远程登录账…

【开源】基于JAVA+Vue+SpringBoot的班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

C++进阶——C++11(右值引用)

一、右值 VS 左值 官方定义是,可以直接取得到地址的对象就是左值,而不能取地址的对象就是右值。但按我的理解来说,如果这个对象是有名字(变量名)的,那就是左值;而除常量数组之外,如…

第206篇| 新年有趣的产品发现;所谓正确的价值观

这是2024年一月份flomo和notion 上聚合的系列文章之(02); 具体方法用的是这个 : 【知识沙虫,一个简单易用的知识体系建模工具】https://mp.weixin.qq.com/s/V2Cdq-1PbMQYvpE4o9NLpQ 首先,方法用下来还是很…

人工智能能产生情绪吗?

此图片来源于网络 一、人情绪的本质是什么? 人的情绪本质是一个复杂的现象,涉及到生理、心理和社会的多个层面。以下是关于情绪本质的几种观点: 情绪的本质是生命能量的表达。情绪被认为是生命能量的一种体现,通过情绪的体验和…

【踏雪无痕的痕二】——小学一年级数学题窥探蝴蝶效应

目录 一、背景介绍二、思路&方案三、过程1.结果一致过程不一致带来的偏差2.再举两个例子,你品一品3.我曾经的培养计划背后的"力量"?4.蝴蝶效应——混沌或非线性理论什么是蝴蝶效应? 5.内心深处的小恶魔(人性的使然) 四、总结 一…

春节假期:思考新一年的发展思路

春节假期是人们放松身心、享受家庭团聚的时刻,但除了走亲戚、玩、吃之外,我们确实也需要思考新的一年的发展思路。以下是一些建议,帮助您在春节假期中为新的一年做好准备: 回顾过去,总结经验:在春节期间&a…

react中hook封装一个table组件 与 useColumns组件

目录 1:react中hook封装一个table组件依赖CommonTable / index.tsx使用组件效果 2:useColumns组件useColumns.tsx使用 1:react中hook封装一个table组件 依赖 cnpm i react-resizable --save cnpm i ahooks cnpm i --save-dev types/react-r…