最近我们项目在开展一个慈善活动,需要大家积极参与,去对拍品进行评价。老大派给了我一个任务就是每日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