chikuchikugonzalezの雑記帳

趣味とか日記とかメモとか(∩゚д゚)

MySQLのテーブル一覧の各テーブルのレコード数をカウントするスクリプト

ある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;}'

自分のメモでした。

*1:6行もあるのでワンライナーじゃない

*2:後半全部フォーマット処理