はじめに
- 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