Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Linux sed命令的应用

Linux sed命令的应用

作者头像
AsiaYe
发布于 2019-11-06 07:22:38
发布于 2019-11-06 07:22:38
2.7K0
举报
文章被收录于专栏:DBA随笔DBA随笔
Linux Sed命令在工作中的使用
一个线上问题的引发的思考

昨天在处理一个日常运维工单的时候,出现了一个问题,大概是这样的:快到双十一了,公司需要拓展业务,开发的同事想要在一个数据库里面的所有表中添加几个字段,给的SQL原型如下,其中的数据库名称、表名称、字段名称以及注释我简单进行了修改:

ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col1` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col2` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col3` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col4` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col5` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col6` int(11) NOT NULL DEFAULT 0 COMMENT '*****';ALTER TABLE `db_name`.`tbl_name1` ADD COLUMN `new_col7` int(11) NOT NULL DEFAULT 0 COMMENT '*****';

因为这些操作是需要对指定数据库中所有的表都进行处理,接到这个需求,我首先连上了指定服务器上对应的数据库看了看这个数据库中存在多少个,结果如下:

...

每张表都需要添加上面的7个字段,一共需要的语句是204*7=1428条。这么大的数据量,肯定是不可能通过人工去实现的,观察这些表的名称结构,只有后缀名是不一样的,而且是按照自然日顺序排列的日表。看到这里,想起了一个以前同事写的脚本,恰好能解决这个问题,这个脚本的思路是这样的:将上面的7个SQL语句执行204遍,每一遍只对数据表的名称进行更换。

这样,问题就被定位成了怎样在每次循环的时候去更改表名称。这里不卖关子了,直接给出脚本的内容:

startdate=`date -d "20181028" +%Y%m%d`enddate=`date -d "20181101" +%Y%m%d`function main(){while [[ ${startdate} < ${enddate} ]] do echo ${startdate}cat /home/yeyz/create_sql.sql >> /home/yeyz/alter_table.sqlsed -i "s/20181028/${startdate}/g" /home/yeyz/alter_table.sql echo "" >> /home/yeyz/alter_table.sql echo startdate=`date -d "+1 day ${startdate}" +%Y%m%d`done}main

用vim打开就是这样的:

简单说明一下,create_sql.sql里面是那7个添加字段的SQL,alter_table.sql是最终的结果。需要注意的是,SQL语句中需要添加一个时间后缀,仅仅是为了替换,没有别的意义。create_sql.sql的内容如下:

首先,定义两个时间类型的变量,一个起始时间,一个终止时间,然后进行循环,对那7个SQL语句中的时间进行替换,然后将起始时间+1,再去参与到下一轮的循环当中。

在这个过程中,我们对每一轮循环时候的起始时间进行了echo打印,为了实验效果好,我们把时间设定为2018.10.28---2018.11.01,只有4天,跑这个脚本,在Linux的控制终端 我们会看到如下的结果:

可以看出,时间已经开始叠加了。再打开alter_create.sql,可以看到它里面的SQL已经变成这样:

后面每一天的alter语句都出现了,而且时间也已经发生了相应的改变。这样我们就能复制这些SQL直接去线上环境执行了,问题也就解决了。

回过头来再看这个脚本,这个脚本中最重要的一句是:

sed -i "s/20181028/${startdate}/g" /home/yeyz/alter_table.sql

这句话的linux里面的sed命令,它的目的是在文件中的每一行去匹配20181028,然后用startdate去替换它,它的语法是:

sed -i "s/旧名称/新名称/g" file

是不是感觉这个命令的功能很强大?这个命令还有很多其他的功能,明天把sed这个命令详细讲一讲吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-11-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
数据治理(四):数据仓库数据质量管理
下面我们针对音乐数据中心数仓项目第四个业务:“统计地区营收情况业务”来说明数据质量如何进行管理。此业务数据质量管理重点放在 ODS层,EDS层(DWD层、DWS层)、DM层几个方面,每层数据校验的内容不一样,我们可以通过自己编写通用shell+Hive脚本或者使用质量监控工具Griffin来进行数据质量监控。
Lansonli
2022/04/08
1.5K1
数据治理(四):数据仓库数据质量管理
MyCAT中的DDL
今天开发同学提了一个需求,是希望对某一个时间范围的表做DDL操作,看起来好像复杂度也不高。
jeanron100
2018/07/26
1.2K0
MySQL常用命令学习笔记
检测数据库名称是否存在,不存在则创建 CREATE DATABASE [IF NOT EXISTS] db_name;
yuanfan2012
2019/09/17
4750
MySQL常用命令学习笔记
一千行 MySQL 详细学习笔记
https://shockerli.net/post/1000-line-mysql-note/
帅地
2019/06/06
2.6K0
关于null值的一个小问题
一个业务方给了一个SQL,要让在线上执行,具体的SQL抽象完成之后是这样的:
AsiaYe
2019/11/06
6540
MySQL学习笔记(二)
二、SQL基本知识 SQL 是一种典型的非过程化程序设计语言,这种语言的特点是:只指定哪些数据被操纵,至于对这些数据要执行哪些操作,以及这些操作是如何执行的,则未被指定。非过程化程序设计语言的优点在于它的简单易学,因此已经成为关系数据库访问和操纵数据的标准语言。 表是数据在一个 SQL 数据库中的存储机制,它包含一组固定的列。表中的列描述该表所跟踪的实体的属性,每个列都有一个名字及各自的特性。 列由两部分组成:数据类型(datatype)和长度(length)。 MySQL数据类型: 字符串值:字符串是类似
mukekeheart
2018/02/27
1.5K0
MySQL学习笔记(二)
SQL系列(三)SQL使用的旁枝末节
这里重点说一下严格模式和非严格模式:Hive在严格模式下查询时,需指定分区(查询分区表时),排序后需增加limit限制,不支持笛卡尔积查询。防止误操作等造成的资源浪费。
HsuHeinrich
2023/02/24
4870
SQL系列(三)SQL使用的旁枝末节
收藏|我的Mysql学习笔记
SQL是一个存活近半个世纪的语言,如今仍有大量人在使用。它语法简单,对培养数据整理和提取的思维有很大帮助。我将我过去的笔记分享给大家,希望能为大家的学习提供参考,更希望有人因此能迈出学习SQL的第一步~
刘早起
2020/05/13
1.3K0
收藏|我的Mysql学习笔记
入门MySQL——基础语句篇
前面几篇文章,我们介绍了MySQL的基础概念及逻辑架构。相信你现在应该有了自己的一套MySQL环境,接下来我们就可以开始练习MySQL了。本文将从MySQL最基础的语句出发,为你展示出创建及修改不同对象应该使用的标准语句。
MySQL技术
2019/09/08
4950
MySQL 之高级命令(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一,该笔记用于生产环境快速查阅.
王 瑞
2022/12/28
1.1K0
MySQL 常用命令 原
(adsbygoogle = window.adsbygoogle || []).push({});
tianyawhl
2019/04/04
8650
MySQL库操作、表操作
实例操作: 创建一个database1的数据库: 指令:create database database1;
南桥
2024/07/26
2990
MySQL库操作、表操作
MySQL DDL 数据定义
在 MySQL 中,DATABASE 和 SCHEMA 在语法上是等效的,它们都用于创建数据库。在其他 RDBMS(如 Oracle 和 SQL Server)
恋喵大鲤鱼
2023/10/12
4250
一个小时学会MySQL数据库
该文是对一篇新闻文章的摘要总结。
张果
2018/01/04
4.1K0
一个小时学会MySQL数据库
MySQL/MariaDB基础性知识及DDL操作详解
前言 MySQL/MariaDB是一个开放源码的小型关联式数据库管理系统,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL/Ma
小小科
2018/05/02
1.6K0
MySQL/MariaDB基础性知识及DDL操作详解
LAMP的搭建与MariaDB的基础使用
LAMP指的Linux(操作系统)、ApacheHTTP 服务器,MySQL(有时也指MariaDB,数据库软件) 和PHP(有时也是指Perl或Python) 的第一个字母。LAMP便成了一组常用来搭建动态网站或者服务器的开源软件,本身都是各自独立的程序,但是因为常被放在一起使用,拥有了越来越高的兼容度,共同组成了一个强大的Web应用程序平台。
小柒吃地瓜
2020/04/23
2.4K0
一千行MySQL命令
非常不错的总结,强烈建议保存下来,需要的时候看一看。 基本操作 数据库操作 表的操作 数据操作 字符集编码 数据类型(列类型) 列属性(列约束) 建表规范 SELECT UNION 子查询 连接查询(join) TRUNCATE 备份与还原 视图 事务(transaction) 锁表 触发器 SQL编程 存储过程 用户和权限管理 表维护 杂项 基本操作 /* Windows服务 */ -- 启动MySQL net start mysql -- 创建Windows服务 sc create
Ai学习的老章
2019/09/17
2.1K0
MySQL 索引
数据库索引是一种数据结构,用于加速数据库查询操作。它是一个单独的数据结构,存储了特定列的值以及指向包含这些值的数据行的指针。通过使用索引,数据库可以更快速地定位和检索数据,而不必扫描整个表。
恋喵大鲤鱼
2023/10/12
3790
分库分表之第五篇
电商平台商品列表展示,每个列表项中除了包含商品基本信息、商品描述信息之外,还包括了商品所属的店铺信息,如下 :
海仔
2020/02/11
6570
【Greenplum】TPC测试指南
TPC-B是由TPC(Transaction Processing Performance Council,事务处理性能委员会)提供的benchmark,主要用于衡量一个系统每秒能够处理的并发事务数。TPC-B不像TPC-C那样模拟了现实生活中一个具体的交易场景,其中的事务都是由简单SQL构成的没有语义的事务(事务中混杂了大表与小表的插入、更新与查询操作),而且每个client的请求间也不会像TPC-C那样会有一个human think time的间隔时间,而是一旦前一个事务执行完成,立马会有下一个事务请求发出。因此,TPC-B经常用于对数据库系统的事务性能压测。TPC-B性能的衡量指标是每秒处理的事务数量,即TPS(Transactions per Second)。
辉哥
2021/06/08
1.8K0
【Greenplum】TPC测试指南
相关推荐
数据治理(四):数据仓库数据质量管理
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档