あるDBに含まれるテーブルのレコード数をカウントしなきゃならん状態になったので、show tablesの結果からselect count(*)を作るようなスクリプトを書いてみた。
まずはテーブル一覧から
show tables \G;
(あえて\Gで一行づつ出力してます) 結果は
*************************** 1. row *************************** Tables_in_test: sample
なので、ここからテーブル名だけを取り出してSELECT文にします。
gawkで切り出します
次のawkスクリプト
{ if (NR % 2 == 0) { # 偶数行だけ処理 printf "SELECT COUNT(*) AS %s FROM %s \\G;\n", $2, $2; } }
で切り出すと
SELECT COUNT(*) AS sample FROM sample \G;
になる。一応テーブル全部こうなるはず。これをmysqlに流せばテーブルのレコード数が取得できる。
何がしたいのか?
で、上のスクリプトを(ほぼ)*1ワンライナー*2でやるとこうなります。一応整形もしてます。
#!/bin/bash USERNAME=mysql PASSWORD=mysql DATABASE=test MYSQL_OPTIONS="--user=$USERNAME --password=$PASSWORD $DATABASE" mysql -e 'show tables \G;' $MYSQL_OPTIONS | gawk '{ if (NR % 2 == 0) printf "SELECT COUNT(*) AS %s FROM %s \\G;\n", $2, $2;}' | mysql $MYSQL_OPTIONS | gawk -F '([[:blank:]]|:)+' 'BEGIN { printf "%-22s | %-7s\n", "TABLE NAME", "RECORDS"; printf "--------------------------------\n"; } { if (NR % 2 == 0) printf "%-22s | %7d\n", $1, $2;}'
自分のメモでした。