shell脚本连接mongodb数据库并对数据进行处理
shell定义
shell百度百科是这样解释的:shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(命令解析器)。它类似于DOS下的command.com和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
基本上shell分为两大类:
(1)图形界面shell(Graphical User Interface shell 即 GUI shell)
例如:应用最为广泛的Windows Explorer(微软的Windows系列操作系统),还有也包括广为人知的Linux shell,其中linux shell包括 X window manager,以及功能更强大的CDE、GNOME、KDE、XFCE。
(2)命令式shell(Command Line Interface shell,即 CLI shell)
例如:bash/sh/ksh/csh(Unix/Linux 系统)
示例:shell脚本连接mongodb数据库并对数据进行处理
(1)连接mongodb数据库
❤ 没有开启mongodb数据库验证:mongo ip/数据库 例如:mongo 192.168.208.1:27017/joe
❤ 开启了数据库验证:mongo -u root -p root --authenticationDatabase admin 192.168.208.1/joe
(2)直接先来一个例子
#!/bin/bash #执行的命令 #nohup /home/myshell/hello.sh > /home/myshell/logs/addData.log 2>&1 & #死循环 while true do #每天一点至二点之间执行 nowhour=`date '+%H'` if [ $nowhour == '01' ];then #获取当前日期和具体的时间 nowdate=`date -d 'now' +%Y%m%d` nowtime=`date -d 'now' +%Y%m%d\ %H:%M:%S` #时间格式注意:必须加上\,不然会报错 #获取当前时间的秒数 nowSecond=`date +%s -d 'now'` echo $nowtime"-----生成数据开始-----" #获取昨天的日期 dayago=`date -d 'yesterday' +%Y%m%d` #对日期加上单引号 yesterday=`(echo $dayago|sed "s/\w\+/'&'/g")` now=`(echo $nowdate|sed "s/\w\+/'&'/g")` #输出看看加上引号没有 echo $yesterday #连接mongodb数据库 mongo 192.168.248.129:27017/joe --eval " db.user.insert({ \"name\":\"kobe\", \"sex\":\"男\", \"age\":39 }); db.nba.insert({ \"name\":\"kobe\", \"sex\":\"男\", \"age\":39, \"optDate\":$now });" nowtim=`date -d 'now' +%Y%m%d\ %H:%M:%S` nowSeconds=`date +%s -d 'now'` times=$(($nowSeconds-$nowSecond)) #休眠时间=一个小时减去脚本所消费的时间 t=$((3600-$times)) echo $nowtim"-----生成数据结束-----" sleep $t else sleep 1h fi done #给用户文件夹的操作权限:chown -R Joe /home/myshell #给文件可执行权限:chmod +x /home/myshell/addData.sh #vim 文件名 使用命令 :set ff? 可查看格式是dos还是unix 使用命令 :set ff=unix 可以将dos格式转换为unix格式 #--eval "" 冒号里面的内容是不能加上注释的,不然会报错
项目要求是对mongodb中的数据进行处理后再将处理后的数据插入数据库,这样避免查询的时候对数据进行处理,加快查询速度,由于公司的账号不是root权限,所以不能通过crontab定时任务去做,所以只能在后台启动一个线程一直循环运行,到达时间点后,再执行,我设定的时间是在凌晨一点到两点之间。
说说上面的shell经常踩的坑(LZ也是含着眼泪踩过来的,毕竟第一次写):
(1)写好shell后,如果你不是root账号登录,需要给你使用的用户授权文件夹的操作你才能对其传文件:chown -R Joe /home/myshell
(2)给写好的shell可执行权限:chmod +x /home/myshell/addData.sh
(3)执行后如果报错:bad interpreter: No such file or directory。多半的原因是因为你的shell文档的格式不对。(LZ是在Windows上的notepad++里面编写的shell,就会导致这个问题,当然你也可以通过notepad++来修改shell的格式和编码),这里介绍linux里的操作方法:
❤ 首先使用vi 或者 vim 打开shell
❤ 然后使用命令 :set ff? (查看当前shell的格式是dos还是unix)
❤ 如果是dos格式,使用命令 :set ff=unix,可以将shell格式修改为unix格式。
(4)nowtime=`date -d 'now' +%Y%m%d\ %H:%M:%S`,获取时间包括时分秒的时候,必须加上 \ 防止将空格转义导致报错。
(5)dayago=`date -d 'yesterday' +%Y%m%d`,获取时间的时候+后面不能有空格,必须连着写,而且等号后面不能有空格,LZ不会告诉你就因为这个搞了我半个小时。
(6)now=`(echo $nowdate|sed "s/\w\+/'&'/g")`,(因为LZ需要先查询出数据,然后处理后再写入处理好的数据,与上述例子无关),由于时间格式是String不是Date,所以需要将Date加上单引号,千万别写错。
(7)nohup /home/myshell/addData.sh > /home/myshell/logs/addData.log 2>&1 &,这个命令的意思:后台执行addData.sh,并将log写到addData.log文件中,2>&1表示:执行正确的信息和错误的信息都写到addData.log中。
(8)--eval " ":(这个命令还不是很懂,留着以后搞懂后再来更新),还是有注意点:
❤ --eval必须跟在连接数据库之后(即:数据库连接 (空格) --eval " ");
❤ 引号里面的内容不能有注释也就是 #.....
❤引号里面的内容有特殊字符需要保留的需要在前面加上\,防止转义(\"name\":\"kobe\")
❤引号里面可以连续写几个不同的数据库操作,需要使用分号(;)隔开
❤ 引号里面不可以使用shell的命令,比如 echo '-----开始-------',运行时会报错
(9)if [ $nowhour == '01' ],if后必须有空格,[ ] 左右也必须有空格。
(10)再介绍几种shell中加上引号或者替换空格的方法:
❤ 给属性加上引号
ret=`(echo a b c d|sed "s/\w\+/'&'/g")` echo $ret
输出 'a' 'b' 'c' 'd'
❤ 将空格替换为逗号
ret=`(echo a b c d|sed 's/\s\+/,/g')` echo $ret
输出 a,b,c,d
❤ 将空格替换为逗号的同时给属性加上单引号:
ret=`(echo a b c d|sed 's/\s\+/,/g')|sed "s/\w\+/'&'/g"` echo $ret
输出'a','b','c','d'
posted on 2019-04-19 08:42 AoTuDeMan 阅读(1502) 评论(0) 编辑 收藏 举报