1.実行前
==USER IMPORTからEND==迄にUSERテーブルにINSERTしたいデータが格納されている
DATA_SAMPLE1.TXT
...
==USER IMPORT
ckhaorus ckhaorus pawpOMFPAOKWDDK41po2kldaodkPAOWK
matchan matchan HcrUC/zoaeQjF4XLVQbYk1TkHjhHkEkD+z8DFtc9SrY=
END==
==SCHEDULE IMPORT
2019/10/27 01:42:32
2019/10/27 02:15:16
...
2.処理内容
text_import_env.sh
#!/bin/bash### ディレクトリ名INPUT_DIR="/home/ckhaorus/csv-import/INPUT_DIR"WORK_DIR="/home/ckhaorus/csv-import/WORK_DIR"### MYSQLMYSQL_HOST="127.0.0.1"MYSQL_USER="root"MYSQL_PWD="root"MYSQL_DB="sample"###返却値END_STATUS=0 # 正常終了INVALID_DIRECTORY_STATUS=10 # INPUT_DIR不正function log(){echo-e"$(date'+%Y-%m-%dT%H:%M:%S')$1"}function infStr(){
log "INFO SH10001[]: $1: START[]"}function infEnd(){
log "INFO SH10002[]: $1: END[] STATUS CODE: $2"exit"$2"}function inputFileIsNotFoundErr(){
log "ERROR SH20001[]: $1: INPUT FILE IS NOT FOUND."}text_import.sh
#!/bin/bash### ファイル名CONFIGURATION_FILE="text_import_env.sh"BASEFILE_NAME="text_import.sh"### ファイルパターンINPUT_FILE_PATTERN=".*DATA_[A-Z]+[1-9].TXT.*"DATA_START_PATTERN="==USER IMPORT"DATA_END_PATTERN="END=="LINE_NO_PATTERN="s/:.*//g"# 設定ファイルの読み込みsource"${CONFIGURATION_FILE}"# 処理の開始
infStr "${BASEFILE_NAME}"# INPUT_DIR内にファイルが配置されているか確認if[!"$(ls"${INPUT_DIR}")"];then# ファイルが配置されていない場合、ERRORログ「SH20001」: INPUT_DIR内にファイルが存在しないを表示し、シェルを終了する。
inputFileIsNotFoundErr "${BASEFILE_NAME}"
infEnd "${BASEFILE_NAME}""${INVALID_DIRECTORY_STATUS}"fi# WORK_DIR内の全ディレクトリ・ファイルに対して削除を行い、WORK_DIRを初期化する。rm-rf"${WORK_DIR:?}/"*# INPUT_DIRからFILE_PATTERNにマッチする全ファイルに対して、WORK_DIRに移動する。
find "${INPUT_DIR}"-type f -regextype posix-egrep -regex"${INPUT_FILE_PATTERN}" | xargs -I% mv % "${WORK_DIR}"# WORK_DIR内のFILE_PATTERNにマッチする全ファイルに対してループfor filepath in$(find "${WORK_DIR}"-type f -regextype posix-egrep -regex"${INPUT_FILE_PATTERN}");do# ファイル名取得base_filename=$(basename"${filepath}")# 出力ファイル名取得data_filename=$(echo"${base_filename}" | cut-d"."-f 1)"_USER.TXT"# データの開始~終了行取得start_line=$(grep-no"${DATA_START_PATTERN}""$filepath" | sed-e"${LINE_NO_PATTERN}")end_line=$(grep-no"${DATA_END_PATTERN}""$filepath" | sed-e"${LINE_NO_PATTERN}")# 行番号指定でデータを抜き出し、<元ファイル名_USER.TXT>に出力する。sed-n"${start_line},${end_line}p""$filepath">"${WORK_DIR}/${data_filename}"done# user_import.shを起動
bash user_import.sh
# WORK_DIR内の全ディレクトリ・ファイルに対して削除を行い、WORK_DIRを初期化する。rm-rf"${WORK_DIR:?}/"*# 処理の終了
infEnd "${BASEFILE_NAME}""${END_STATUS}"user_import.sh
#!/bin/bash### ファイル名CONFIGURATION_FILE="text_import_env.sh"BASEFILE_NAME="user_import.sh"### ファイルパターンUSER_FILE_PATTERN=".*DATA_[A-Z]+[1-9]_USER.TXT.*"### テーブル名TEMP_TABLENAME="temp_user"# 環境設定ファイルの読み込みsource"${CONFIGURATION_FILE}"# WORK_DIR内のFILE_PATTERNにマッチする全ファイルに対してループfor filepath in$(find "${WORK_DIR}"-type f -regextype posix-egrep -regex"${USER_FILE_PATTERN}");do
while read line;do
if[[${line:0:1}=~ [a-z] ]];then# ファイル名取得base_filename=$(basename"$filepath")# 出力ファイル名取得csv_filename=$(echo"${base_filename}" | cut-d"."-f 1)".CSV"# 各カラムの取得login_id=$(echo"${line}" | awk'{print $1}')name=$(echo"${line}" | awk'{print $2}')password=$(echo"${line}" | awk'{print $3}')# TODO:LOAD DATA LOCAL INFILE文が使用不可# echo "\"${login_id}\",\"${name}\",\"${password}\"" >> "${WORK_DIR}/${csv_filename}"# temp_userテーブルに対してINSERTを行う。
mysql -h"${MYSQL_HOST}"-u"${MYSQL_USER}"-p"${MYSQL_PWD}"--database="${MYSQL_DB}"-e"INSERT INTO ${TEMP_TABLENAME} (login_id, name, password) VALUES ('${login_id}', '${name}', '${password}');"fi
done< "${filepath}"done3.出力
正常系.sh
2020-10-27T07:56:46 INFO SH10001[]: text_import.sh: START[]
2020-10-27T07:56:47 INFO SH10002[]: text_import.sh: END[] STATUS CODE: 0
異常系.sh
2020-10-27T07:57:26 INFO SH10001[]: text_import.sh: START[]
2020-10-27T07:57:26 ERROR SH20001[]: text_import.sh: INPUT FILE IS NOT FOUND.
2020-10-27T07:57:26 INFO SH10002[]: text_import.sh: END[] STATUS CODE: 10