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

news2024/12/27 14:30:37

这里写目录标题

  • 一. 需求分析
  • 二. 从日志中抽取出指定字段,并切分为若干个子文件
  • 三. 生成查询执行计划
  • 四. 生成查询的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.coloradmin.cn/o/1443974.html

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

相关文章

在VSCode中创建Java项目

在VSCode中创建Java项目 首先,保证安装了Java的JDK. WinR -> 输入cmd -> 输入 java -version -> 然后可以看到安装的JDK版本,如果没安装可以去找教程。 JDK安装参考教程 打开VSCode,打开扩展(Ctrl Shift S&#xff…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之AlphabetIndexer组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、AlphabetIndexer组件 可以与容器组件联动用于按逻辑结构快速定位容器显…

每日五道java面试题之java基础篇(四)

第一题. 访问修饰符 public、private、protected、以及不写(默认)时的区别? Java 中,可以使⽤访问控制符来保护对类、变量、⽅法和构造⽅法的访问。Java ⽀持 4 种不同的访问权限。 default (即默认,什么也不写&…

Elasticsearch:混合搜索是 GenAI 应用的未来

在这个竞争激烈的人工智能时代,自动化和数据为王。 从庞大的存储库中有效地自动化搜索和检索信息的过程的能力变得至关重要。 随着技术的进步,信息检索方法也在不断进步,从而导致了各种搜索机制的发展。 随着生成式人工智能模型成为吸引力的中…

【Python如何求出所有3位数的回文数】

回文数就是正向读和逆向读都相同的数,如66,626,72127 1、求出所有3位数的回文数python代码如下: # 输出所有3位数的回文数 for i in range(100, 1000): # 从100循环到999,不包含1000if str(i) str(i)[::-1]: # 如…

CSS3 基本语法

CSS3 基本语法 1. CSS3 新增长度单位 rem 根元素字体大小的倍数,只与根元素字体大小有关。vw 视口宽度的百分之多少 10vw 就是视口宽度的 10% 。vh 视口高度的百分之多少 10vh 就是视口高度的 10% 。vmax 视口宽高中大的那个的百分之多少。(了解即可&am…

centos中docker操作+安装配置django并使用simpleui美化管理后台

一、安装docker 确保系统是CentOS 7并且内核版本高于3.10,可以通过uname -r命令查看内核版本。 更新系统软件包到最新版本,可以使用命令yum update -y。 安装必要的软件包,包括yum-utils、device-mapper-persistent-data和lvm2。使用命令yum install -y yum-utils devic…

【制作100个unity游戏之23】实现类似七日杀、森林一样的生存游戏10(附项目源码)

本节最终效果演示 文章目录 本节最终效果演示系列目录前言快捷栏绘制UI代码控制快捷列表信息 源码完结 系列目录 前言 欢迎来到【制作100个Unity游戏】系列!本系列将引导您一步步学习如何使用Unity开发各种类型的游戏。在这第23篇中,我们将探索如何制作…

C语言-----自定义类型-----结构体枚举联合

结构体和数组一样,都是一群数据的集合,不同的是数组当中的数据是相同的类型,但是结构体中的数据类型可以不相同,结构体里的成员叫做成员变量 结构体类型是C语言里面的一种自定义类型,我们前面已经了解到过int,char,fl…

2024 年 5 款适用于免费 iPhone 数据恢复的工具软件

搜索一下,你会发现许多付费或免费的iPhone数据恢复工具声称它们可以帮助你以很高的成功率找回所有丢失的数据。然而,这正是问题所在。真的很难做出选择。为了进一步帮助您解决数据丢失问题,我们在此列出了 5 款最好的免费 iPhone 恢复软件供您…

计算机网络——07协议层次及服务模型

协议层次及服务模型 协议层次 网络是一个复杂的系统 网络功能复杂:数字信号的物理信号承载、点到点、路由、rdt、进程区分、应用等现实来看,网络的许多构成元素和设备: 主机路由器各种媒体的链路应用协议硬件,软件 问题是&am…

C++ 贪心 区间问题 区间分组

给定 N 个闭区间 [ai,bi] ,请你将这些区间分成若干组,使得每组内部的区间两两之间(包括端点)没有交集,并使得组数尽可能小。 输出最小组数。 输入格式 第一行包含整数 N ,表示区间数。 接下来 N 行&…

蓝桥杯每日一题------背包问题(三)

前言 之前求的是在特点情况下选择一些物品让其价值最大,这里求的是方案数以及具体的方案。 背包问题求方案数 既然要求方案数,那么就需要一个新的数组来记录方案数。动态规划步骤如下, 定义dp数组 第一步:缩小规模。考虑n个物品…

CSP-202009-2-风险人群筛查

CSP-202009-2-风险人群筛查 解题思路 检查是否经过高危区 (x > x1) && (x < x2) && (y > y1) && (y < y2) 检查坐标是否在高危区域内&#xff0c; !isPassed 确保仅在第一次经过高危区域时增加 pass 计数。如果条件成立&#xff0c;表示…

Python3集合 set 心得

Python3集合 set 心得 本文是个人在学习中的一些心得&#xff0c;不能保证文中的内容准确&#xff0c;欢迎大家批评指正。 集合 set 是Python中的一种数据容器&#xff0c;集合有2种定义方式。 1、花括号 {} &#xff0c;花括号内加入集合的元素&#xff0c;元素之间用逗号 …

spark sql上线前的调试工作实现

背景 每个公司应该都有大数据的平台的吧&#xff0c;平台的作用就是可以在上面执行各种spark sql以及定时任务&#xff0c;不过一般来说&#xff0c;由于这些spark sql的上线不经过测试&#xff0c;所以可能会影响到生产的数据&#xff0c;这种情况下大数据平台提供一个上线前…

网络扫描神器:Nmap 保姆级教程(附链接)

一、介绍 Nmap&#xff08;Network Mapper&#xff09;是一款用于网络发现和安全审计的开源工具。它最初由 Gordon Lyon&#xff08;也被称为 Fyodor Vaskovich&#xff09;开发&#xff0c;是一款功能强大且广泛使用的网络扫描工具。Nmap 允许用户在网络上执行主机发现、端口…

【十四】【C++】list 的常见用法

list 的初始化和遍历 /*list的初始化和遍历*/ #if 1 #include <list> #include <vector> #include <iostream> #include<algorithm> using namespace std;void TestList1(){list<int> L1;list<int> L2(10, 5);vector<int> v{1,2,3,4…

奇异值分解(SVD)的应用——图像压缩

SVD方法是模型降阶的一类重要方法&#xff0c;本征正交分解&#xff08;POD&#xff09;和平衡截断&#xff08;BT&#xff09;都属于SVD类方法。 要想深入了解模型降阶技术&#xff0c;我们可以先从SVD的应用入手&#xff0c;做一个直观的了解。 1. SVD的定义和分类 我们想寻找…

01-Spring实现重试和降级机制

主要用于在模块调用中&#xff0c;出现失败、异常情况下&#xff0c;仍需要进行重复调用。并且在最终调用失败时&#xff0c;可以采用降级措施&#xff0c;返回一般结果。 1、重试机制 我们采用spring 提供的retry 插件&#xff0c;其原理采用aop机制&#xff0c;所以需要额外…