はじめに
DBのクライアントツール(a5:SQL Mk-2とか)が使える環境であれば特段困らないが、そうもいかないとCSVを出すのは至難の業…ということでshで一発でやれるshを作りました。
手順
confファイルを作る
(shの中でmysqlコマンドを実行するところでユーザとパスワードを指定することもできますが、実行時に警告が出るのでやっておいたほうが吉。)
mysql.conf
[client]
user = DBのユーザ
password = DBのパスワード
# ↓必要に応じて別ホスト経由で接続する場合に記載
host = DBのIPアドレス
shを作る
get_csv.sh
#!/bin/bash
# 使用するdatabase
DB="$1"
# 実行するSQLファイルパス
FILE_PATH="$2"
# confファイルパス
CONF_PATH="$3"
if [ $# != 3 ]; then
echo "Usage : ./get_csv.sh データベースの名前 実行するSQLのファイルパス"
echo "Example: ./get_csv.sh sample_db /home/mome1014/test.sql /home/mome1014/mysql.conf"
exit 1
fi
# SQLファイルのディレクトリパス
DIR_PATH=${FILE_PATH%/*}
# SQLのファイル名
FILE_NAME=${FILE_PATH##*/}
# 拡張子なしのファイル名
BASE_FILE_NAME=${FILE_NAME%.*}
echo "----- logging into db ${DB} as admin execute ${FILE_PATH} start -----"
CMD=`mysql --defaults-extra-file=${CONF_PATH} --database=${DB} < ${FILE_PATH} >
${DIR_PATH}/${BASE_FILE_NAME}.txt`
# 各行の一番前(「^」)に「"」を付加
`cat ${DIR_PATH}/${BASE_FILE_NAME}.txt | sed -e 's/^/"/g' > ${DIR_PATH}/${BASE_FILE_NAME}2.txt`
# 各行の一番後(「$」)に「"」を付加
`cat ${DIR_PATH}/${BASE_FILE_NAME}2.txt | sed -e 's/$/"/g' > ${DIR_PATH}/${BASE_FILE_NAME}3.txt`
# タブ「/t」を「","」に変更
`cat ${DIR_PATH}/${BASE_FILE_NAME}3.txt | sed -e 's/\t/","/g' > ${DIR_PATH}/${BASE_FILE_NAME}.csv`
# 中間ファイルの削除
`rm -rf ${DIR_PATH}/${BASE_FILE_NAME}.txt`
`rm -rf ${DIR_PATH}/${BASE_FILE_NAME}2.txt`
`rm -rf ${DIR_PATH}/${BASE_FILE_NAME}3.txt`
echo "----- logging into db ${DB} as admin execute ${FILE_PATH} end -----"
echo "output result ${DIR_PATH}/${BASE_FILE_NAME}.csv"
実行
Usage: ./get_csv.sh ${database_name} ${sql_file_path} ${conf_file_path}
下記の例の場合は、sample_dbにアクセス(confファイルは/home/mome1014/mysql.confを使う)、 /home/mome1014/test.sqlを実行して、結果のCSVが/home/mome1014/test.csvで出力されます。
$ ./get_csv.sh sample_db /home/mome1014/test.sql /home/mome1014/mysql.conf
↧