通过脚本(awk,grep)清洗实体类数据,存入数据库

Posted DATA数据猿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过脚本(awk,grep)清洗实体类数据,存入数据库相关的知识,希望对你有一定的参考价值。

通过脚本(awk,grep)清洗实体类数据,存入数据库

👊一、前言

  部分数据库在建表的时候,不能像mysql一样直接在字段后加comment对字段做注释。通过comment on column dbname.tablename.fieldname is '';的方式一个一个加字段注释较为麻烦,而一般在项目代码中都会对字段做备注,所以打算使用Linux的grep和awk写脚本进行处理,然后存入到数据库的一张表中,以便查看。
  Linux三剑客,grep擅长查找功能,sed擅长取行和替换,awk擅长取列
  如下,就简单模拟一些实体类文件进行介绍,在实际场景中也是同样的操作。

👊二、逐步处理过程

🙇‍♀2.1 cat实体类

  cat命令可直接在终端查看文件数据

[root@zxy_master dao]# cat ./User.java
package com.zxy.pojo;

import java.util.Date;

public class User 
    private Integer id;//ID

    private String email;//邮箱

    private String phonenum;//电话

    private String password;//密码

    private String code;//编码

    private String nickname;//昵称
...................

🙇‍♀2.2 grep只查看字段行

  将cat到的结果以管道的形式,传给grep做处理。使用grep只查询包含private的行

[root@zxy_master dao]# cat ./User.java | grep private
    private Integer id;//ID
    private String email;//邮箱
    private String phonenum;//电话
    private String password;//密码
    private String code;//编码
    private String nickname;//昵称
    private String sex;//性别
    private String birthday;//出生日期
    private String address;//地址
    private String imgurl;//头像URL
    private Date createtime;//创建时间

🙇‍♀2.3 awk空格切分取第三列

  将grep查询到的数据,以管道的形式的传给awk做处理。awk命令加-F,可以指定按照什么切分数据。使用print输出数据,$3可以用来取切分后的第三列数据。

[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3'
id;//ID
email;//邮箱
phonenum;//电话
password;//密码
code;//编码
nickname;//昵称
sex;//性别
birthday;//出生日期
address;//地址
imgurl;//头像URL
createtime;//创建时间

🙇‍♀2.4 awk指定符号切分,并依据空格输出

  经过上一步的处理,得到了字段和注释,现在字段和注释之间只有符号;//,所以再次使用awk,按照这些字符切分后,分别取到第一和第二个数据输出即可。为方便后续导入到数据库中,在字段和注释之间,以空格划分。

[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'print $1"\\t"$2'
id      ID
email   邮箱
phonenum        电话
password        密码
code    编码
nickname        昵称
sex     性别
birthday        出生日期
address 地址
imgurl  头像URL
createtime      创建时间

🙇‍♀2.5.1 输出处理结果

  将上一步处理的结果,以文件的形式处理,这里采用>>文件数据追加的方式。

[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'print $1"\\t"$2' >> JavaETLFile.txt
[root@zxy_master dao]# cat JavaETLFile.txt
id      ID
email   邮箱
phonenum        电话
password        密码
code    编码
nickname        昵称
sex     性别
birthday        出生日期
address 地址
imgurl  头像URL
createtime      创建时间

🙇‍♀2.5.2 优化输出处理结果

  从上一步可以看出,输出的结果中只有数据,如果后续将数据导入表中的话,是需要对数据做一下标注的。

  这里为了效果明细,先把上一步生成的文件删除,在awk后添加,BEGIN print "field""\\t""remark",即可实现在第一行输出指定数据。


[root@zxy_master dao]# rm -r JavaETLFile.txt
rm: remove regular file ‘JavaETLFile.txt’? y
[root@zxy_master dao]# cat ./User.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' 'BEGIN print "field""\\t""remark" print $1"\\t"$2' >> JavaETLFile.txt
[root@zxy_master dao]# cat JavaETLFile.txt
field   remark
id      ID
email   邮箱
phonenum        电话
password        密码
code    编码
nickname        昵称
sex     性别
birthday        出生日期
address 地址
imgurl  头像URL
createtime      创建时间

👊三、完善处理过程一

🙇‍♀3.1 脚本介绍

  以上内容,简单介绍了整体的处理流程,但是使用命令行的形式,一个一个的处理实体类还是比较麻烦的,这一步就通过将命令写到脚本中,通过传入实体类名的形式依次处理。

  通过 1 接收脚本传入的参数 , 将传入的参数赋给 F i l e N a m e ,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是 ‘ 1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是` 1接收脚本传入的参数,将传入的参数赋给FileName,后续能直接使用这个参数接收值。主要在两个部分用到,第一个是FileName.java,从而获取原始数据。第二个是-v filename=“$FileName”,使用-v可以动态获取参数,从而将filename的数据使用print filename"\\t"$1"\\t"$2命令。

[root@zxy_master dao]# vim JavaToTxt.sh
#!/bin/bash
# filename: JavaToTxt.sh
# auth: zxy
# date: 2022-09-04

# 接收参数
FileName=$1

cat ./$FileName.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' -v filename="$FileName" 'BEGIN print "tablename""\\t""field""\\t""remark" print filename"\\t"$1"\\t"$2' >> JavaETLFile.txt

🙇‍♀3.2 脚本测试

[root@zxy_master dao]# sh JavaToTxt.sh User
[root@zxy_master dao]# cat JavaETLFile.txt
tablename       field   remark
User    id      ID
User    email   邮箱
User    phonenum        电话
User    password        密码
User    code    编码
User    nickname        昵称
User    sex     性别
User    birthday        出生日期
User    address 地址
User    imgurl  头像URL
User    createtime      创建时间

👊三、完善处理过程二

  通过如上脚本,即可以在执行脚本的时候传入实体类名称进行处理数据,下面就再次通过脚本,一次性获取所有实体类的执行命令。对这个指令就不做详细的介绍,不太明白的可以参考第二节的介绍

[root@zxy_master dao]# ls
Admin.java  Course.java  JavaToTxt.sh  QueryVo.java  Speaker.java  User.java

[root@zxy_master dao]# ll | grep '.java' | awk -F ' ' 'print $9' | awk -F '.' 'print "sh JavaToTxt.sh "$1'
sh JavaToTxt.sh Admin
sh JavaToTxt.sh Course
sh JavaToTxt.sh QueryVo
sh JavaToTxt.sh Speaker
sh JavaToTxt.sh User

[root@zxy_master dao]# sh JavaToTxt.sh Admin
[root@zxy_master dao]# sh JavaToTxt.sh Course
[root@zxy_master dao]# sh JavaToTxt.sh QueryVo
[root@zxy_master dao]# sh JavaToTxt.sh Speaker
[root@zxy_master dao]# sh JavaToTxt.sh User
[root@zxy_master dao]#

[root@zxy_master dao]# cat JavaETLFile.txt
tablename       field   remark
Admin   id      ID
Admin   username        用户名
Admin   password        密码
Admin   roles   角色
tablename       field   remark
Course  id      ID
Course  courseTitle     课程标题
Course  subjectId       主题ID
Course  courseDesc      课程详情
Course  videoList;
tablename       field   remark
QueryVo title   标题
QueryVo courseId        课程ID
QueryVo speakerId       讲师ID
tablename       field   remark
Speaker id      ID
Speaker speakerName     讲师名
Speaker speakerJob      讲师工作
Speaker headImgUrl      头像URL
Speaker speakerDesc     讲师介绍
tablename       field   remark

👊四、完整处理脚本

#!/bin/bash
# filename: JavaToTxt.sh
# auth: zxy
# date: 2022-09-04

# 接收参数
FileName=$1

# 帮助函数
usage() 
        echo "usage:"
        echo "sh JavaToTxt.sh filename"
        echo "获取批量处理文件命令如下:"
        echo "ll | grep '.java' | awk -F ' ' 'print $9' | awk -F '.' 'print "sh JavaToTxt.sh "$1'"
        exit 0


cat ./$FileName.java | grep private | awk -F ' ' 'print $3' | awk -F ';//' -v filename="$FileName" 'BEGIN print "tablename""\\t""field""\\t""remark" print filename"\\t"$1"\\t"$2' >> JavaETLFile.txt

👊五、数据导入

  将txt文件下载下来,导入到数据库中即可,方法很多,仅供参考。

DBeaver线下数据导入数据库表

👊六、数据简单处理

  因为在执行脚本时,每执行一次都会输出一次使用awkBegin的内容,也就是tablename,field,remark,在导入数据后做简单处理。另一种是,当字段没有注释的时候,会存在切分后取到一行空值的,处理即可。

以上是关于通过脚本(awk,grep)清洗实体类数据,存入数据库的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本之grep的使用方法

shell脚本学习总结----sed+grep+awk+正则

Nginx/Apache日志分析脚本

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

linux生产文本处理掌握这些就够了:awk,gawk,sed,grep,sort

通过netstat和awk查看服务器的连接数