《懒人Shell脚本》之七——格式化处理数据存入数据库实现

简介: 0、引言实际应用开发中遇到:将非格式化的文件数据存储到数据库中。对于传统的格式化的数据:ini/json/xml我们都有现成的类库去实现。而对于如下非格式化的数据呢?以下是我的思考与实现。

数据截取片段如下所示:


[root@localhost 2017]# head -n 10 input.txt


[url]http://epaper.tianjinwe.com/mrxb/mrxb/2013-02/21/content_7566593.htm

新报讯【记者王晶通讯员赵子强】对31.66万平方米的旧楼进行改造,建成丰达园二期配套幼儿园,全年新增就业3600人,城乡居民医疗保险参保率达100%……津南区咸水沽镇2017年度为民服务十项民心工程确定,涉及基础设施、教育、环境治理、居民保障增收、困难群众生活等多个方面。  今年,咸水沽镇将加快示范镇建设进程,启动四里沽村住宅拆迁,完成博雅时尚三期16.5万平方米还迁房全部配套工作,完成东张庄、北洋村还迁工作,启动金丰里四、五号库项目31.15万平方米的还迁工作,保证吴稻地、李庄子、潘庄子村群众顺利还迁。同


[url]http://epaper.tianjinwe.com/mrxb/mrxb/2013-02/21/content_7566617.htm

2月21日 星期二  天津卫视(101)  19:30 快乐生活剧场:星光灿烂(5、6)  21:25 幸福来敲门  天视1套(102)  18:30 都市报道60分  19:30 第1观察  21:00 新闻延长线  21:30 热播1小时  天视2套(103)  18:40 多彩剧场:老公们的私房钱(47);咱家(1、2)  21:10 音乐视界  天视3套(104)  20:00 晚八点剧场:战神之血染的青春(21-23)  22:40 晚间剧场:山河同在(42、43)  天视5套(106)  18:00 旗开得胜  19:30 我是棋王(23)  21:35 科学健身一点通  21:45 一马当先  22:00 牌王看牌  天视6套

1

2

3

4

5

6

7

1、思路探讨

1)转化为格式化数据。

如何将一大段的包含换行、任意特殊字符的变量的文本内容赋值格式化是个问题?


2)文件读取,存储为不同的两个变量。根据文件特点,无非是:url作为key,汉字的内容作为value。用Map或者HashMap存储即可。这里不论是用C++或Java读文件,都是一笔不小的工作量开销。但我的时间只允许1个小时左右。


综上,选择shell脚本做格式化处理。

大致思路是:

1)url行保留,便于提取。

2)剩下的未被格式化的文本,删除空行、删除换行符,添加content的标记,便于提取。

3)一次提取一个url与之对应的content,构造成所需要的sql即可。


2、核心实现步骤

第1步:格式化文本文件

在url行的下一行的首部添加content=,目的:便于进行检索。


sed -i '/^\[url/ { n; s/^/content=/; }' $RST_FILE

1

第2步:删除空行

sed -i '/^$/d' $RST_FILE

1

第3步:提取url

cat $RST_FILE | grep url > $URL_FILE

1

第4步:删除处理过的url行

sed -i '/url/d' $RST_FILE

1

第5步:换行符替换为空格

sed -i ':a;N;$ s/\n/ /g;ba' $RST_FILE

1

第6步:content前加换行符

sed -i 's#content#\ncontent#g' $RST_FILE

1

第7步:提取content到content.txt

cat $RST_FILE | grep content > $CONTENT_FILE

1

3、脚本源码

分割为两个文件逐行进行遍历。


#!/bin/sh

CONTENT_FILE=./content.txt

URL_FILE=./url.txt

RST_FILE=./input.txt


#格式化文件

function format_process()

{

 sed -i '/^\[url/ { n; s/^/content=/; }' $RST_FILE

 sed -i '/^$/d' $RST_FILE

 cat $RST_FILE | grep url > $URL_FILE

 #删除处理过的url行

 sed -i '/url/d' $RST_FILE

 sed -i ':a;N;$ s/\n/ /g;ba' $RST_FILE

 sed -i 's#content#\ncontent#g' $RST_FILE

 cat $RST_FILE | grep content > $CONTENT_FILE

}


#生成sql

function build_rstdate()

{

icnt=1;

cat $CONTENT_FILE | while read line

do

 mkdir -p ./output

#生成每个独立的content文件

 echo $line > ./output/content_${icnt}.txt

 sed -i 's#content\=##g' ./output/content_${icnt}.txt

 icnt=$[$icnt+1];

 echo icnt=$icnt;

done;


export gcnt=0;

iurlcnt=0;

cat $URL_FILE | while read line

do

 iurlcnt=$[$iurlcnt+1];

 echo $iurlcnt > ./output/.cnts_rst.txt

#生成每个独立的url文件


 echo $line > ./output/url_${iurlcnt}.txt

 sed -i 's#\[url\]##g' ./output/url_${iurlcnt}.txt

 #export gcnt=$iurlcnt;

done;


gcnt=`cat ./output/.cnts_rst.txt`

echo gcnt=$gcnt


#构造成sql文件

cat /dev/null > update_sql.sql

for((i=1;i<=$gcnt;i++))

do

 url=`cat ./output/url_${i}.txt`;

 content=`cat ./output/content_${i}.txt`;

 # echo url=$url

 # echo content=$content

 echo "update gather_rst set content='$content' where url='$url';" >> update_sql.sql


done;

}


format_process;

build_rstdate;

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

格式化xml脚本实现

[root@localhost 2017]# cat build_input.sh

#!/bin/sh


sed -i 's#</content>#</contentsize>#g' input.xml

sed -i 's#<content>#<contentsize>#g' input.xml

sed -i 's#</snapshot>#</snapshotsize>#g' input.xml

sed -i 's#<snapshot>#<snapshotsize>#g' input.xml

sed -i 's#<is_site_homepage>#</is_site_homepage>#2' input.xml

#在文件头插入格式化字符串

sed -i '1i\<?xml version="1.0" encoding="UTF-8"?>' input.xml

sed -i '2i\<HotNewsList>' input.xml

#文件末尾加入特定字符串

sed -i '$a\</HotNewsList>' input.xml

1

2

3

4

5

6

7

8

9

10

11

12

13

4、小结

shell对文本的处理真的非常强大。一些命令行还不能“信手拈来”,有待进一步掌握提高!

相关文章
|
26天前
|
存储 人工智能 Cloud Native
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
在9月20日2024云栖大会上,阿里云智能集团副总裁,数据库产品事业部负责人,ACM、CCF、IEEE会士(Fellow)李飞飞发表《从数据到智能:Data+AI驱动的云原生数据库》主题演讲。他表示,数据是生成式AI的核心资产,大模型时代的数据管理系统需具备多模处理和实时分析能力。阿里云瑶池将数据+AI全面融合,构建一站式多模数据管理平台,以数据驱动决策与创新,为用户提供像“搭积木”一样易用、好用、高可用的使用体验。
云栖重磅|从数据到智能:Data+AI驱动的云原生数据库
|
1月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
126 68
|
28天前
|
SQL 关系型数据库 数据库
国产数据实战之docker部署MyWebSQL数据库管理工具
【10月更文挑战第23天】国产数据实战之docker部署MyWebSQL数据库管理工具
94 4
国产数据实战之docker部署MyWebSQL数据库管理工具
|
28天前
|
Shell Linux 测试技术
6种方法打造出色的Shell脚本
6种方法打造出色的Shell脚本
52 2
6种方法打造出色的Shell脚本
|
17天前
|
缓存 监控 Shell
如何使用 HBase Shell 进行数据的实时监控和备份?
如何使用 HBase Shell 进行数据的实时监控和备份?
|
17天前
|
Shell 分布式数据库 Hbase
如何使用 HBase Shell 进行数据的批量导入和导出?
如何使用 HBase Shell 进行数据的批量导入和导出?
|
14天前
|
XML JSON 监控
Shell脚本要点和难点以及具体应用和优缺点介绍
Shell脚本在系统管理和自动化任务中扮演着重要角色。尽管存在调试困难、可读性差等问题,但其简洁高效、易于学习和强大的功能使其在许多场景中不可或缺。通过掌握Shell脚本的基本语法、常用命令和函数,并了解其优缺点,开发者可以编写出高效的脚本来完成各种任务,提高工作效率。希望本文能为您在Shell脚本编写和应用中提供有价值的参考和指导。
41 1
|
19天前
|
Ubuntu Shell 开发工具
ubuntu/debian shell 脚本自动配置 gitea git 仓库
这是一个自动配置 Gitea Git 仓库的 Shell 脚本,支持 Ubuntu 20+ 和 Debian 12+ 系统。脚本会创建必要的目录、下载并安装 Gitea,创建 Gitea 用户和服务,确保 Gitea 在系统启动时自动运行。用户可以选择从官方或小绿叶技术博客下载安装包。
40 2
|
25天前
|
关系型数据库 分布式数据库 数据库
云栖大会|从数据到决策:AI时代数据库如何实现高效数据管理?
在2024云栖大会「海量数据的高效存储与管理」专场,阿里云瑶池讲师团携手AMD、FunPlus、太美医疗科技、中石化、平安科技以及小赢科技、迅雷集团的资深技术专家深入分享了阿里云在OLTP方向的最新技术进展和行业最佳实践。
|
2月前
|
监控 网络协议 Shell
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
49 6