やる気がストロングZERO

やる気のストロングスタイル

簡単な自動化はシェルコマンドで手軽にできる

「シェルコマンドを使いこなせたらいろいろ便利なんだろうなあ」というイメージがあった。 この本(シェルプログラミング実用テクニック)を読んで勉強してみた。

シェルプログラミング実用テクニック (Software Design plus)

シェルプログラミング実用テクニック (Software Design plus)

手慣れるといろいろな作業時間が短縮できそう。 単純な作業ならスクリプトを書かずとも簡単に自動化できたので書いてみる。

動機:たくさんあるsqlを順番に適用する作業を自動化したかった

下記のようなディレクトリ構造で、これらのsqlをすべて定期的に実行する必要があった。

|-- 01
|   |-- 01.sql
|   |-- 02.sql
|   |-- 03.sql
|   |-- 04.sql
|   `-- 05.sql
`-- 02
    |-- 01.sql
    |-- 02.sql
    |-- 03.sql
    |-- 04.sql
    `-- 05.sql

今まではひとつずつ、GUIクライアントツールでsqlファイルを開いて実行をしていた。

pythonとかでスクリプトを書けばそれほど難しくなく自動化できると思うけど、 シェルコマンドならスクリプトを書くまでもないのではないかと思っていた。

上記の本を読んだ結果、これは下記コマンドで一発で実行できた

find . -type f | grep -e "^\./01.*sql$" -e "^\./02.*sql" | sort | xargs -n 1 sqlcmd -S . -E -d dbname -b -i 

(sqlcmdはsqlserverのクライアントコマンド。適宜実行したいコマンドに入れ替えてください)

順に説明を記載していく

find . -type f

これはカレントディレクトリ(.)以下のファイルをすべて一覧する、というコマンド。 -type オプションにfを指定することで「ファイルのみ」をリストするように指定している。

./で実行すると

./01/05.sql
./01/02.sql
./01/03.sql
./01/01.sql
./01/04.sql
./02/05.sql
./02/02.sql
./02/03.sql
./02/01.sql
./02/04.sql

という結果を返す。それをパイプ「|」を使ってgrepへ渡す

grep -e "^./01.sql$" -e "^./02.sql"

これは上記の結果内容から、[./01〜〜sql]と[./02〜〜sql]という行のみを取得し結果を返す。 今回はなにも除去されないが、もし不要なファイルが入っていたらそれを除去するのが目的。

./01/05.sql
./01/02.sql
./01/03.sql
./01/01.sql
./01/04.sql
./02/05.sql
./02/02.sql
./02/03.sql
./02/01.sql
./02/04.sql

という結果を返す。それをパイプ「|」を使ってsortへ渡す

sort

これは上記結果をソートして並び直す。今回は順番にsqlを実行する必要があるので必要。

./01/01.sql
./01/02.sql
./01/03.sql
./01/04.sql
./01/05.sql
./02/01.sql
./02/02.sql
./02/03.sql
./02/04.sql
./02/05.sql

という結果を返す。それをパイプ「|」を使ってxargs -n 1 sqlcmd -S . -E -d dbname -b -i へ渡す

xargs -n 1 sqlcmd -S . -E -d dbname -b -i

xargsは標準入力からもらった内容を指定コマンドの引数として渡す事ができる。 例えば標準入力からa, b, cを受け取った場合、

(a, b, cを標準出力するコマンド) | xargs 何らかのコマンド

何らかのコマンド a b c

が実行される事になる。

-nオプションをつけると一度にわたす引数の数を指定することができる。

(a, b, cを標準出力するコマンド) | xargs -n 1 何らかのコマンド

とすると、

何らかのコマンド a
何らかのコマンド b
何らかのコマンド c

と実行することと同義となる。

今回はsqlcmdに一つずつsqlファイルを引数として渡して実行していくことで、 目的のsqlのすべてを一発で実行することができた。

他にもいろいろ具体的な利用ケースとともにコマンドの使い方が解説されているのでおすすめ。

シェルプログラミング実用テクニック (Software Design plus)

シェルプログラミング実用テクニック (Software Design plus)