經(jīng)常會遇到這種情況,在一個不能上網(wǎng)的環(huán)境通過MySQL客戶端登錄數(shù)據(jù)庫,想執(zhí)行一個操作,卻忘了操作的具體語法,各種不方便。
其實,MySQL數(shù)據(jù)庫內置了幫助文檔,通過help contents即可查看。
如下所示:

可見,該文檔涵蓋了數(shù)據(jù)庫操作的大部分主題。
文檔分為以上幾大類,每個大類又包括更小粒度的類,類最后有具體的topic組成。
那么這之間的層級關系如何呢?
昨天想執(zhí)行一個操作
mysql> backup table emp to '/tmp/mysqlbackup';
因為這個backup操作以前沒有使用過,準備用MySQL自帶的幫助文檔來查看具體的用法。本來這個命令所屬的類別就有點模糊,譬如Administration和Utility都有可能。最后找了一通,還是沒有找到。
想了想,這樣查看幫助文檔確實沒有太大的效率,如果知道這之間的層級關系就好辦了。
于是,動手寫了個腳本,可直觀的顯示幫助文檔中大類與小類,小類與topic之間的關系。
具體如下:
| #!/bin/bash#所有操作都是在/tmp/test中操作,因為中間新建了很多臨時文件,方便后續(xù)的刪除。mkdir /tmp/test#獲取上圖的內容重定向到/tmp/test/test.txt文件中mysql -uroot -p123456 -e "help contents " > /tmp/test/test.txt#定義輸出的格式,/t輸出tab,/b相當于backspace一個空格,參考了tree命令的輸出方式。format="|/t/b"#刪除第一行和最后一行sed -i '1d;$d' /tmp/test/test.txtcd /tmp/test#引入number的作用在于后續(xù)格式的輸出number=0#后續(xù)用了遞歸調用,這里定義的是函數(shù)function recursive(){filename=$1number=$[$number+1]while read linedo#name要做為文件名,譬如Account Management,利用tr函數(shù)是去掉字符中間的空格name=`echo $line|tr -d [:blank:]`#輸出每個分類中的內容,可能是topic,可能是categoriesmysql -uroot -p123456 -e "help $line" > $name#取輸出文件的第一行的內容,如果是具體的topic,則第一行的內容為:Name: 'ALTER USER',不然就還是categories,需要遞歸調用firstline=`head -1 $name`#整個邏輯比較復雜的有兩類,一個是Numeric Functions,另一個是PLUGINS。先說PLUGINS,一般對于一個具體的topic,它的輸出類似于Name: 'ALTER USER',而PLUGINS#對應的輸出卻是Name: 'SHOW PLUGINS',所以下面的判斷語句多了一個"$firstline" = "Name: 'SHOW PLUGINS'",針對的即是PLUGINS。另一比較復雜的是Numeric Functions#它下面的topic有除號“/”,而這基本上是不能作為文件名的。所以在下面的判斷邏輯中,如果遇到Numeric Functions,就直接打印出該類中的topic,而不進行Name: 'ALTER USER'這樣的判斷if [ "$firstline" = "Name: '$line'" -o "$firstline" = "Name: 'SHOW PLUGINS'" ];thenfor i in `seq $[$number-1]`do echo -ne $formatdoneecho "├── $line"else#如果不是topic,則代表是categories,可遞歸進行判斷,唯一的例外就是Numeric Functions#下面的echo "├── $line"打印出的是categories的名字for i in `seq $[$number-1]`do echo -ne $formatdoneecho "├── $line"#遇到Numeric Functions,就直接打印出該類中的topicif [ "$line" = "Numeric Functions" ];thensed -i '1d;$d' $namewhile read functions dofor i in `seq $number`do echo -ne $formatdoneecho "├── $functions"done < $nameelse#其它的categories,遞歸調用該函數(shù)進行判斷。sed -i '1d;$d' $namerecursive $namenumber=$[$number-1]fifidone < $filename}#主函數(shù)recursive /tmp/test/test.txt#處理完畢,刪除文件夾rm -rf /tmp/test |