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'

  • 相关阅读:
    教程:在 Visual Studio 中开始使用 Flask Web 框架
    教程:Visual Studio 中的 Django Web 框架入门
    vs2017下发现解决python运行出现‘No module named "XXX""的解决办法
    《sqlite权威指南》读书笔记 (一)
    SQL Server手工插入标识列
    hdu 3729 I'm Telling the Truth 二分图匹配
    HDU 3065 AC自动机 裸题
    hdu 3720 Arranging Your Team 枚举
    virtualbox 虚拟3台虚拟机搭建hadoop集群
    sqlserver 数据行统计,秒查语句
  • 原文地址:https://www.cnblogs.com/Joe-Go/p/10726006.html
Copyright © 2011-2022 走看看