MySql是一个广泛使用的数据库操作系统,我们亦可以从shell脚本中访问并操作MySQL数据,我们利用脚本将CSV或者文本文件的内容写入数据库,于MySQL交互并且读取处理数据,我们可以通过shell脚本来执行查询语句
我们将展示如何编写shell去读取到MySql中的数据
我们需要安装了对应的mysql-server和mysql-client,而且需要得到了对应的用户名和密码
我们可以使用sort,awk等Bash工具,来方便我们创建数据库和数据表,向数据表中插入数据,从数据表中读取并显示处理过的数据
创建数据库的脚本如下
#! /bin/bash
#文件名: create_db.sh
#用途: 创建了MySql数据库和数据表
USER=”user”
PASS=”user”
mysql -u $USER -p$PASS <<EOF 2> /dev/null
CREATE DATABASE test1;
EOF
[$? -eq 0] && echo Created DB || echo DB is already exist
#创建表
mysql -u $USER -p$PASS students <<EOF 2> /dev/null
CREATE TABLE students(
id int;
name varchar(100),
mark int,
dept varchar(4)
);
EOF
[ $? -eq 0 ] && echo Created table students || echo Table students
already exist
这样就是建立数据库完成了
然后将数据插入整个数据表
#!/bin/bash
#从csv中读取数据并写入
USER=”user”
PASS=”user”
if [ $# -ne 1 ];
then
echo $0 DATAFILE
echo
exit 2
fi
data=$1
while read line;
do
oldIFS=$IFS
IFS=,
values=($line)
values[1]=”\”`echo ${value[1]} | tr ‘ ‘ ‘#’`\””
values[3]=”\”`echo ${value[3]}`\””
query=`echo ${value[@]} |tr ‘#’ ‘,’`
IFS=$oldIFS
mysql -u $USER -p$PASS students <<EOF
INSERT INTO students VALUES($query);
EOF
done< $data
echo Wrote data into DB
查询脚本如下
#! /bin/bash
USER=”user”
PASS=”user”
depts=`mysql -u $USER -p$PASS students <<EOF | tail -n +2
select distinct dept from studentsl
EOF`
for d in $depts;
do
echo Department : $d
result=”`mysql -u $USER -p$PASS students <<EOF`”
SET @i:=0;
SELECT @i:=@i+1as rank,name,mark FROM students
where dept=”$d” ORDER
BY mark DESC;
EOF`”
echo “$result”
echo
done
对于的脚本实现如下
第一个脚本,我们用来创建数据库students,我们需要用户名和密码,mysql命令用于对mysql进行操作,mysql命令指定了账户密码,然后创建了对应的数据库,为了避免显示错误,我们将错误进行了重定向,然后检查退出状态,来获得是否成功,并打印不同的语句,同理,创建数据表的时候,我们可以进行了错误重定向,然后检查退出状态,如果存在,就会显示一条提示信息
第二个脚本
然后我们接收包含学生数据的CSV,用while循环来读取CSV的每一行,然后,每次迭代都会受到一个逗号分割的句子,我们将其存入了一个数组,然后利用切换IFS来进行存储为一个数组
由于其中name和department 是字符串,我们先将这两个字符串内的空格替换为#,然后替换回来,然后构建成了查询语句
第三个脚本
read_db.sh是用来查询各个系的学生并打印出来各个系的学生排名列表,然后第一次找到各个系的名称,然后查询每个系,并按照成绩的高地进行显示,
SET @i:=0是设置变量i的手段,方便每次查询都增加i显示排名