シェルスクリプトで SQL の結果を1行づつ処理する
シェルスクリプトで PostgreSQL の SQL 実行結果を1行づつ処理する場合どのようにシェルスクリプトを組めばよいのか説明していきます。1行づつ処理したい SQL とその実行結果を確認
まず最初に1行づつ処理したい SQL とその実行結果を確認しましょう。ここでは pg_tables というテーブルから得られる PostgreSQL のシステムテーブル一覧を 1行づつシェルスクリプトで処理する場合で説明します。
以下は今回1行づつ処理したい SQL とその実行結果です。
=> SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'pg_catalog' ORDER BY schemaname, tablename LIMIT 10; ------------+----------------- schemaname | tablename ------------+----------------- pg_catalog | pg_aggregate pg_catalog | pg_am pg_catalog | pg_amop pg_catalog | pg_amproc pg_catalog | pg_attrdef pg_catalog | pg_attribute pg_catalog | pg_auth_members pg_catalog | pg_authid pg_catalog | pg_cast pg_catalog | pg_class ------------+----------------- (10 rows)
シェルスクリプトの作成
ここでは test.sh というシェルスクリプトを以下の内容で作成します。#!/bin/bash SQL=$(cat << EOD SELECT schemaname, tablename FROM pg_tables WHERE schemaname = 'pg_catalog' ORDER BY schemaname, tablename LIMIT 10 EOD ) echo ${SQL} | psql \ -h 127.0.0.1 \ -p 5432 \ -d hoge \ -U postgres \ --no-align \ -t \ --field-separator '|' \ -q \ | while IFS='|' read schemaname tablename ; do cat <<EOD =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : ${schemaname} tablename : ${tablename} EOD done
SQL 実行結果をパイプ(|)でシェルのループ処理に渡してあげて、その結果をシェルスクリプト内で1行ずつ処理するというものになります。
シェルスクリプを実行
では早速作成した test.sh スクリプトを実行してみましょう。結果は次のようになります。$ chmod 744 ./test.sh $ ./test.sh =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_statistic =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_type =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_attribute =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_authid =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_proc =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_class =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_user_mapping =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_constraint =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_inherits =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+= [Table Information] schemaname : pg_catalog tablename : pg_index
このスクリプトを改変することでいろんなフォーマットでデータを1行づつ表示したり加工したりすることが出来るようになります。
cron 経由でのレポートも簡単に作成できますね。