SQL用のテストデータをシェルスクリプトで作成

2017.02.06

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

簡単なテストをする際にはテストデータを作る事がありますが、毎回面倒だなと思っていたので、シェルスクリプトで簡単に作れないか調べてまたので備忘録として書いておきます。

環境

Mac OSX 10.10.5 Yosemite

シェルスクリプト: create_tsv.sh

#!bin/bash

## 開始時間を標準出力(%sで秒数。%Sとは違う)
start=`gdate +%s`

## 作成する行数
ROWS=$1
## 作成するファイルパス
FILEPATH=$2

# ファイル作成
> $FILEPATH

# ユニークなランダム文字列を作成 -> 配列にする
array=(`cat /dev/urandom | LC_CTYPE=C tr -dc 'a-zA-Z0-9' | fold -w 16 | head -n \`expr $(expr $ROWS + 1) + 1\` | uniq`)

# 指定した行数の作成
for i in `seq 1 $1`
do

    echo $i'\t'${array[i]}'\t'$(gdate --date "$i days" +"%Y-%m-%d %H:%M:%S")  >> $FILEPATH

    if [[ $i -eq 1 ]]; then
      echo $i'\t'${array[i]}'\t'$(gdate --date "$i days" +"%Y-%m-%d %H:%M:%S")
    fi

done

# 時間を標準出力
end=`gdate +%s`
echo 'start: '$start
echo 'end:   '$end
echo '処理時間: '`expr $end - $start`'秒'

実行結果

第1引数:作成する行数、第2引数:作成するファイル名。

$ chmod 755 create_tsv.sh
$ sh create_tsv.sh 1000 test.tsv
1	kN9a7kpk	2017-02-07 00:42:00
start: 1486308879
end:   1486308885
処理時間: 6秒

test.tsvには下記の様に1000行作成されます。

$ head -n 5 test.txt
1	APQWDcApCrP2ewrO	2017-02-07 01:02:35
2	5XD4OrSCpYXJtpNt	2017-02-08 01:02:35
3	ZNcQyWQrKAOUsdRV	2017-02-09 01:02:35
4	2lv9PLwK4LZHc0Q1	2017-02-10 01:02:35
5	PH5vUQQyhu5bVadY	2017-02-11 01:02:35

使用したコマンドなどについて

時間の作成

現在日時を取得できるdateはMacにも用意されていますが、BSD版というものでLinuxのdateとは違う様です。
が、gdateを使えばLinux版と同じ様に使用できるそうなので使用しました。
インストールは下記で。

$ brew install coreutils

スクリプトでの使用方法は以下の2つ。
処理の開始と終了の秒数を取得は「gdate +%s」で、1970年1月1日0時からの秒数を取得できます。
日時の作成は「gdate --date "$i days" "%Y-%m-%d %H:%M:%S"」で、i日後をYYYY-MM-DD hh:mi:ssで取得できます。

ランダム文字列の配列を作成

作成には「/dev/urandom」を指定。
「LC_CTYPE=C tr -dc 'a-zA-Z0-9'」で使用する文字を指定。
「fold -w 8」で文字数を8に指定。
「head -n $ROWS」で引数を作成する数に指定。上記では後続のループ処理が1から始まるので+1しています。
「uniq」で作成する文字列が重複しない様に指定。
「()」で囲んで出力結果を配列に指定。

コマンドの入れ子

例として、1+1の結果に+1を計算し標準出力する場合は下記のどちらかの様にします。

echo `expr \`expr 1 + 1\` + 1`
echo `expr $(expr 1 + 1) + 1`

ファイルの追記と上書き

「>」で上書き、もしくは新規作成。
「>>」で追記。

さいごに

3列だけの作成ですが、行数を増やせば簡単なテストには役立つかなと思います。スクリプトは簡単な処理の場合は便利ですね。