在shell脚本中仅打印一次列名

时间:2017-07-06 17:47:03

标签: mysql shell

这是我的shell脚本,它运行正常,没有任何错误。但我希望以不同的方式获得输出。

脚本:

#!/bin/bash
DB_USER='root'
DB_PASSWD='123456'
DB_NAME='job'
Table_Name='status_table'
#sql=select job_name, date,status from $DB_NAME.$Table_Name where job_name='$f1' and date=CURDATE()
file="/root/jobs.txt"
while read -r f1
do
    mysql -N -u$DB_USER -p$DB_PASSWD  <<EOF
select job_name, date,status from $DB_NAME.$Table_Name where job_name='$f1' and date=CURDATE()

EOF
done <"$file"

源表:

mysql> select * from job.status_table
+---------+----------+------------+-----------+
| Job_id  | Job Name |     date   |   status  |
+---------+----------+--------+---------------+
|   111   |    AA    | 2016-12-01 | completed |
|   112   |    BB    | 2016-12-01 | completed |
|   113   |    CC    | 2016-12-02 | completed |
|   112   |    BB    | 2016-12-01 | completed |
|   114   |    DD    | 2016-12-02 | completed |
|   201   |    X     | 2016-12-03 | completed |
|   202   |    y     | 2016-12-04 | completed |
|   203   |    z     | 2016-12-03 | completed |
|   111   |    A     | 2016-12-04 | completed |
+---------+----------+------------+-----------+

输入文本文件

[rteja@server0 ~]# more jobs.txt
AA
BB
CC
DD
X
Y
Z
A
ABC
XYZ

输出 - 被拒绝的姓氏

(mysql -N -u$DB_USER -p$DB_PASSWD  <<EOF)
[rteja@server0 ~]# ./script.sh
  AA       2016-12-01   completed
  BB       2016-12-01   completed 

输出 - 没有抑制列名,输出打印每个循环迭代的列名。

(mysql -u$DB_USER -p$DB_PASSWD  <<EOF)

    [rteja@server0 ~]# ./script.sh
    job_name      date        status
      AA       2016-12-01   completed
    job_name      date        status
      BB       2016-12-01   completed

挑战:

1。只想在输出中打印一次列名,并将结果存储在CSV文件中。

2。我不想公开密码&amp;代码中的用户名给大家。有没有办法隐藏,就像我听说我们可以创建环境变量并在脚本中调用它。我们可以设置环境变量文件的权限,以防止每个人访问它,只有我们应该能够访问它。

1 个答案:

答案 0 :(得分:1)

您可以多次运行单个查询,而不是多次执行选择查询:

job_name in ('AA','BB','CC'...)

为此,首先使用mapfile读取数组中的完整文件:

mapfile -t arr < jobs.txt

然后将数组值格式化为适合IN运算符的值列表:

printf -v cols "'%s'," "${arr[@]}"
cols="(${cols%,})"

显示您的值:

echo "$cols"
('AA','BB','CC','DD','X','Y','Z','A','ABC','XYZ')

最后将您的SQL查询运行为:

mysql -N -u$DB_USER -p$DB_PASSWD <<EOF
select job_name, date,status from $DB_NAME.$Table_Name
where job_name IN "$cols" and date=CURDATE();
EOF

安全地连接到MySQL use login-paths (.mylogin.cnf)

根据MySQL手册:

  

指定服务器连接信息的最佳方法是使用.mylogin.cnf文件。此文件不仅已加密,而且实用程序执行的任何记录都不会公开连接信息。