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编辑  收藏  举报

导航