引言
前两篇已经介绍了在Linux环境中,如何分割文件和合并文件。两片博文的地址分别如下
《Linux工具|运维工具之cat》:https://cloud.tencent.com/developer/article/2466160
《Linux工具|运维工具之split》:https://cloud.tencent.com/developer/article/2466073
今天又拿出来一些时间来写写我为什么写了那两篇基础性知识的博文,他能给我带来什么样的信息以及他能为我做什么。
需求背景
主要还是因为工作关系,我在实际的工作环境中,有 研发环境
、 仿真环境
、 生产环境-开发态
和 生产环境-线上态
,其实每个环境都有开发态和生产态,而我在上述的描述是因为需要做的具体工作衍生出来的问题。比如说我这里在做安全众测时使用的是研发环境,而在做入网安评时却又是使用的仿真环境,而真正的开发环境却在生产环境的开发态,这三个环境又是物理隔离,这的的确确是一个很扯蛋而我又无能为力的事情。作为一名实施运维人员,只能在领导以及建设要求下实施并开展工作。
本次的问题就出现在了研发环境上面,我记得我当时想要将我所有的库表的测试数据取下来,然后导入到研发环境,奈何甲方的运维人员偏偏忘记了机器的密码(修改密码需要走线上流程,也需要领导的审批,一般情况没个三五工作日是下不来的,这又是一件很DT的事情)。
不过很幸运的是可以从DBeaver这个SQL工具通过执行SQL语句来将数据插入到指定的库中,我本来想着可以通过命令将一些测试数据导入到数据库。这个DBeaver也是一个奇葩工具,我将所有的准备工作都做好之后,将数据手工拷贝到SQL编辑器后执行,编辑器执行了一会儿,直接报错了,无法插入数据。查看错误如下:
java.lang.OutOfMemoryError……
第一个问题以及解决办法
方式一
当时比较着急,就按照那边运维人员(暂且叫S工)将文件分割小块给S工,让S工协助处理,将测试数据插入到研发环境。我在当时提供的脚本是一个,而我的主要操作也是通过 cat命令
将每一张表的 insert语句
合并到一个文件。现在不需要这样子处理,却又出现另外一个问题——大数据表问题。有些表的数据量很大,大约有20M的一个.sql文件,如果将这些insert语句执行插入,会有问题,此时又使用split命令将文件进行切分,切分成可以直接拷贝到DBeaver中执行。所以这就是我当时使用的两个方法,一个是cat命令,一个是split命令。
方式二
后面在回顾的时候,发现当时可能太过于着急,其实还有一个方法通过修改工具的配置参数来实现大批量insert执行的问题。
第二个问题以及解决办法
问题和解决思路
在工作是是过程中,我使用cat命令合并文件时,快速完成。当我在使用split命令切分文件后,我发现这些文件没有后缀名。顾名思义,就是我使用split命令后输出的文件为 xxxaa,xxxab,xxxac,……,等等这种没有后缀扩展名的文件,这就有点让我捉摸到头脑了。我当时考虑的是使用linux中的rename命令来进行重命名,如果你有兴趣,也可以参考下我的那一篇博文
《Linux工具|运维工具rename常用命令详解》
这里很详细的介绍了这个命令,可通过这个命令来修改文件的前缀以及后缀。
其实在使用split命令拆分后,我想着能不能有另外一种方式来解决这个问题,后来在网上某篇博文【https://blog.csdn.net/qq_26502245/article/details/100727554】找到了解决办法,那就是结合 linux的命令xargs 和 mv
。
解决办法
直接说解决办法吧,语法如下:
split -l 1000 [源文件] [目标文件] && ls | grep [目标文件] | xargs -I {} mv {} {}.sql
上面的意思就是大概可以分为三个步骤
1、分割文件,将大文件table_xxxx.sql 按照每个文件1000行分割为前缀 table_1124_ 的小文件;
2、找到这些文件并将文件的文件名称作为参数;
3、使用 mv 重新命名的方式增加后缀名称。
实际的shell命令如下:
$ split -l 1000 table_xxxx.sql table_1124_ && ls | grep table_1124_ | xargs -I{} mv {} {}.sql
踩坑点
在MacOS中, xargs命令
用于构建并执行基于UNIX的命令行,它可以处理stdin(标准输入)的数据来构建并执行命令。如果你遇到了xargs后缀一致的问题,这通常意味着你正在尝试使用xargs去执行一个需要特定文件后缀的命令,而且你的输入数据没有正确的文件后缀。主要是Linux中与macOS中不一样。
例如,如果你正在尝试使用xargs来处理一些文件,并且你的命令需要这些文件具有.txt后缀,但是你的输入数据中有一些文件没有这个后缀,那么你可能会遇到问题。
解决这个问题的一种方法是确保你的输入数据包含正确的文件后缀。如果你需要为那些没有.txt后缀的文件添加这个后缀,你可以使用mv命令来重命名这些文件。
例如,如果你有一些文件没有.txt后缀,你可以使用以下命令为它们添加这个后缀。
$ ls | grep -v '\.txt$' | xargs -I {} mv {} {}.txt
这个命令首先列出当前目录下的所有文件,然后使用grep命令排除已经有.txt后缀的文件,然后使用xargs来执行mv命令,为那些没有.txt后缀的文件添加这个后缀。
如果你正在使用其他需要特定文件后缀的命令,你需要调整你的命令或者你的输入数据以确保它们匹配。
总结
问题总没办法多,相信自己,总会解决,在解决问题的路上也需要多思考,多换位思考,因为解决问题的办法永远不只一种,我们需要选择最优的那一种。