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 = 2

whenever 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.sql

echo "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.sql

echo "/*表示形式设定*/
SET ECHO ON
SET PAGESIZE 1000
SET LINESIZE 1000

/*error処理設定*/ 
define ERR_CD = 2

whenever sqlerror exit &ERR_CD rollback;
whenever oserror exit &ERR_CD rollback;

/*以下是SQL文部分*/
" > create_explain.sql

# 折行式写法
for tm in $(seq -f "%02g" 0 分隔后的文件的最大的ID); do
  cat 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); do
    cat info_transactionId_${tm}.txt | sed "s/$/'/; s/^/'/; s/$/,/; 1s/^/SELECT COUNT(*) FROM table_name WHERE ID IN (\n/" | sed '$ s/.$/);/' >> create_exec.sql
done

echo "
/* 添加回滚语句 */
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://www.mfbz.cn/a/382535.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue3 之 商城项目—二级分类

二级分类功能描述 配置二级路由 准备组件模版 <script setup></script><template><div class"container "><!-- 面包屑 --><div class"bread-container"><el-breadcrumb separator">"><el-bre…

python coding with ChatGPT 打卡第19天| 二叉树:合并二叉树

相关推荐 python coding with ChatGPT 打卡第12天| 二叉树&#xff1a;理论基础 python coding with ChatGPT 打卡第13天| 二叉树的深度优先遍历 python coding with ChatGPT 打卡第14天| 二叉树的广度优先遍历 python coding with ChatGPT 打卡第15天| 二叉树&#xff1a;翻转…

在虚拟机上完成Centos安装

Linux学习和使用 前言如何安装Centos初始化操作 使用VMware备份操作系统快照克隆 内容总结参考链接 本人介绍:2023年全国大学生数学建模竞赛国家二等奖,2022年蓝桥杯省二等奖,这里是一个和你一起不断努力,不断前进的程序猿一枚 前言 简单介绍一下本片文章将会讲到的内容:本章节…

关于创建vue项目报错command failed: npm install --loglevel error

一、首先 在这个目录下有个文件叫.vuerc 二、其次 进去之后把里面的"useTaobaoRegistry": false,修改下&#xff0c;我之前是true&#xff0c;后来改成了false才成功。

【大厂AI课学习笔记】【1.6 人工智能基础知识】(1)人工智能、机器学习、深度学习之间的关系

6.1 人工智能、机器学习与深度学习的关系 必须要掌握的内容&#xff1a; 如上图&#xff1a;人工智能>机器学习>深度学习。 机器学习是人工智能的一个分支&#xff0c;该领域的主要研究对象是人工智能&#xff0c;特别是如何在经验学习中改进具体算法的性能。 深度学习…

【MySQL进阶之路】生产案例:数据库无法连接,Too many connections

欢迎关注公众号&#xff08;通过文章导读关注&#xff1a;【11来了】&#xff09;&#xff0c;及时收到 AI 前沿项目工具及新技术的推送&#xff01; 在我后台回复 「资料」 可领取编程高频电子书&#xff01; 在我后台回复「面试」可领取硬核面试笔记&#xff01; 文章导读地址…

【leetcode】965. 单值二叉树

题目链接 965. 单值二叉树 bool isUnivalTree(struct TreeNode* root) {// if (root->left ! NULL && root->right ! NULL) {// return root->val root->left->val// && root->val root->right->val// && isUnivalTr…

算法学习——LeetCode力扣二叉树篇3

算法学习——LeetCode力扣二叉树篇3 116. 填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针 - 力扣&#xff08;LeetCode&#xff09; 描述 给定一个 完美二叉树 &#xff0c;其所有叶子节点都在同一层&#xff0c;每个父节点都有两个子节点。二叉树…

【开源】JAVA+Vue.js实现衣物搭配系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 衣物档案模块2.2 衣物搭配模块2.3 衣物收藏模块 三、系统设计3.1 用例设计3.2 E-R图设计3.3 数据库设计3.3.1 衣物档案表3.3.2 衣物搭配表3.3.3 衣物收藏表 四、系统实现4.1 登录页4.2 衣物档案模块4.3 衣物搭配模块4.4…

C语言每日一题(54)对称二叉树

力扣网 101 对称二叉树 题目描述 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false提…

国际物流数字化运输方式选择指南 | 箱讯科技

国际物流涉及多种运输方式&#xff0c;每种方式都有其独特的优势和适用场景。选择合适的运输方式对于确保货物安全、及时到达目的地并控制成本至关重要。以下是对六种主要国际运输方式的简要介绍和选择建议&#xff1a; 国际快递&#xff1a;适用于小件、高价值或急需的货物。…

游戏服务器租用价格表_TOP3费用对比

游戏服务器租用多少钱一年&#xff1f;1个月游戏服务器费用多少&#xff1f;阿里云游戏服务器26元1个月、腾讯云游戏服务器32元&#xff0c;华为云26元&#xff0c;游戏服务器配置从4核16G、4核32G、8核32G、16核64G等配置可选&#xff0c;游戏专业服务器公网带宽10M、12M、15M…

python+django人力资源管理系统7w5x3

技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具&#xff1a;Navicat 开发软件&#xff1a;PyCharm .设计框架&#xff1a;Vue 1. 表现层&#xff1a;写多…

微软 CMU - Tag-LLM:将通用大语言模型改用于专业领域

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 论文地址&#xff1a;https://arxiv.org/abs/2402.05140 Github 地址&#xff1a;https://github.com/sjunhongshen/Tag-LLM 大语言模型&#xff08…

vue3初识

目录 一、前言二、主观感受三、vue3初探 原文以及该系列教程文章后续可点击这里查看&#xff1a;vue初识 一、前言 Vue.js是一款流行的前端框架&#xff0c;最初由尤雨溪&#xff08;Evan You&#xff09;于2014年创建&#xff0c;非常的年轻。官网为vue3&#xff0c; 但要注…

Java集合 Collection接口

这里写目录标题 集合Collection接口创建一个性表增加元素删除元素修改元素判断元素遍历集合实例判断元素是否存在 集合 Java中的Collection接口是集合类的一个顶级接口&#xff0c;它定义了一些基本的操作&#xff0c;如添加、删除、查找等。Collection接口主要有以下几个常用…

【数据结构与算法】【小白也能学的数据结构与算法】迭代算法专题

&#x1f389;&#x1f389;欢迎光临&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;特别推荐给大家我的最新专栏《数据结构与算法&#xff1a;初学者入门指南》&#x1f4d8;&am…

算法之双指针系列1

目录 一&#xff1a;双指针的介绍 1&#xff1a;快慢指针 2&#xff1a;对撞指针 二&#xff1a;对撞指针例题讲述 一&#xff1a;双指针的介绍 在做题中常用两种指针&#xff0c;分别为对撞指针与快慢指针。 1&#xff1a;快慢指针 简称为龟兔赛跑算法&#xff0c;它的基…

【Rust】——猜数游戏

&#x1f383;个人专栏&#xff1a; &#x1f42c; 算法设计与分析&#xff1a;算法设计与分析_IT闫的博客-CSDN博客 &#x1f433;Java基础&#xff1a;Java基础_IT闫的博客-CSDN博客 &#x1f40b;c语言&#xff1a;c语言_IT闫的博客-CSDN博客 &#x1f41f;MySQL&#xff1a…

Redisson分布式锁 原理 + 运用 记录

Redisson 分布式锁 简单入门 pom <dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.13.6</version></dependency>配置类 package com.hmdp.config;import org.redisson.Redisson;…
最新文章