shell脚本-实现对比

    最近我们项目在开展一个慈善活动,需要大家积极参与,去对拍品进行评价。老大派给了我一个任务就是每日11点进行统计,看看都有哪位兄弟姐妹没有按时去参与,然后进行一下统计;
    其实需求很简单,就是通过UID执行sql语句,然后和统计的信息进行对比,找出不同就行。这个任务很简单,但是持续的时间很长,3个月的时间,想想总不能每日都手动去操作SQL语句然后再拿到Excel中进行对比,找出不同,这种办法效率太低了。所以当收到3个月的持续时长时,第一就想到了通过脚本去执行。

一、Shell基本介绍

    1、Shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用Shell来启动,挂起,停止甚至编写一些程序。
(主要工作就是讲我们的语言翻译成内核可以执行的语言,也就是我们虚拟机书写命令的页面。)
    2、Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性较强。Shell是解释执行的脚本语言,在Shell中可以直接调用Linux系统命令。

二、用到的一些基本语法

1、输入输出重定向

    其实就是将输入或者输出结果放入自己想要指定的文件中,便于查看。比如一些定时执行的shell脚本都是凌晨执行,我们如何判定到时是否执行成功了呢?输入输出重定向则是其主要目的。

  对此只讲述熟悉的输出重定向

1>正确命令保存

类型 符号 作用
标准输出重定向1 命令>文件 以覆盖的方式输出到指定文件
标准输出重定向2 命令>>文件 以追加的方式输出到制定文件

    
2>正确和错误命令同时保存

类型 符号 作用
保存到同一文件(覆盖)方法一 命令>文件2>&1 以覆盖的方式,都保存到同一文件
保存到同一文件(追加)方法一 命令>>文件2>&1 以追加的方式,都保存到同一文件
保存到同一文件(覆盖)方法二 命令&>文件 以覆盖的方式,都保存到同一文件
保存到同一文件(追加)方法二 命令&>>文件 以追加的方式,都保存到同一文件
保存到两个文件 命令>>文件1 2>>文件2 正确的命令到文件一,错误的命令到文件二

2、Bash变量

    变量就是计算机内存单元,其中存放的值可以改变;变量名称可以由字母,数字,下划线组成,但是不能以数字开头;变量的默认类型都是字符串型,如果要进行数值运算,则必修指定变量类型为数值型。
分类:用户自定义变量;环境变量;位置参数变量;预定义变量;

3、正则表达式

1、 正则表达式与通配符的区别

    正则是用来在文件中匹配符合条件的字符串,正则是包含匹配。grep,awk,sed,等命令可以支持正则表达式;
    通配符用来匹配符合条件的文件名,通配符是完全匹配。ls,find,cp这些命令不支持正则表达式,所以只能使用shell自己的通配符来进行匹配了。(*,?,[])

2、基础正则表达式

元字符 说明
* 匹配0次或任意多次;比如匹配含有一个a字符的,那么执行语法则为:grep “aa*” test.txt
. grep “s..d” test.txt 中间可以添加两个除换行符外的任意字符;注:”.*”匹配所有内容
^, $ ^匹配行首
[] 匹配中括号中制定的任意字符
[^] 和[]恰好相反,匹配除中号号中符号之外的任意字符
{n} 表示其前面的字符恰好出现n次
{n,} 表示其前面的字符出现不小于n次
{n,m} 表示匹配其前面的字符至少出现n次,最多出现m次

    
对于功能而言,最重要的还得需要自己去实践,去融入,再此则只是展现了自己能够用到的部分基础。

三、功能实践

    功能很简单,步骤一:查询sql,获取对应UID;步骤二:将对应UID和本地信息进行对比找出不同;步骤三:将不同的UID对应的名称展示出来

查询信息脚本:

#脚本标识
#!/bin/bash   
#将两个文件上次执行的内容清除
>diff.txt
>HUOHUO.txt
#数据库密码
PASS='J6yrwhCoSyzEtbZm'
#连接MySQL,注:执行此语句,虚拟机必须存有mysql客户端
echo "select uid from kupai.user_wallet_log_0 where activity_id=$1 and type=3 and status=1" | mysql -h 10.106.135.3 -P 3002 -u kupaiuser -p$PASS > HUOHUO.txt
#对比,将不同输出到diff.txt中
grep -vwf HUOHUO.txt people.txt |tr '\r' ' ' > diff.txt

对比名称输出脚本:

#脚本标识
#!/bin/bash
#循环对比输出
cat diff.txt |while  read line;
do

#echo $line
grep "$line" peopleName.txt --color

done

最后展示效果图则是UID和名称一一对应输出,格式自己可以定义。以上则是自己的脚本简单实现。

posted on 2017-07-22 17:37  huohuoL  阅读(237)  评论(0编辑  收藏  举报

导航