zoukankan      html  css  js  c++  java
  • 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'

  • 相关阅读:
    WScript.Shell对象的run和exec(脚本调用其他程序)
    Hard link 和 Symbolic link 软链接 硬链接
    SGI STL 红黑树(RedBlack Tree)源代码分析
    宏likely和unlikely
    PCLint输出格式选项
    32位与64位原子操作的问题
    王石与成功的定义
    关于FckEditor基于Asp.net MVC中出现未结束的字符窜常量——解决方案
    崩溃中!Nhibernate的数据分页.
    创建Silverlight技术联盟QQ群 希望大家踊跃加入
  • 原文地址:https://www.cnblogs.com/Joe-Go/p/10726006.html
Copyright © 2011-2022 走看看