如何将MySQL help contents的内容以目录树的形式输出

经常会遇到这种情况,在一个不能上网的环境通过MySQL客户端登录数据库,想执行一个操作,却忘了操作的具体语法,各种不方便。

其实,MySQL数据库内置了帮助文档,通过help contents即可查看。

如下所示:

如何将MySQL help contents的内容以目录树的形式输出

可见,该文档涵盖了数据库操作的大部分主题。

文档分为以上几大类,每个大类又包括更小粒度的类,类最后有具体的topic组成。

那么这之间的层级关系如何呢?

昨天想执行一个操作

mysql> backup table emp to '/tmp/mysqlbackup';

因为这个backup操作以前没有使用过,准备用MySQL自带的帮助文档来查看具体的用法。本来这个命令所属的类别就有点模糊,譬如Administration和Utility都有可能。最后找了一通,还是没有找到。

想了想,这样查看帮助文档确实没有太大的效率,如果知道这之间的层级关系就好办了。

于是,动手写了个脚本,可直观的显示帮助文档中大类与小类,小类与topic之间的关系。

具体如下:

#!/bin/bash #所有操作都是在/tmp/test中操作,因为中间新建了很多临时文件,方便后续的删除。 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.txt cd /tmp/test #引入number的作用在于后续格式的输出 number=0 #后续用了递归调用,这里定义的是函数 function recursive(){ filename=$1 number=$[$number+1] while read line do #name要做为文件名,譬如Account Management,利用tr函数是去掉字符中间的空格 name=`echo $line|tr -d [:blank:]` #输出每个分类中的内容,可能是topic,可能是categories mysql -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'" ];then for i in `seq $[$number-1]` do echo -ne $format done echo "├── $line" else #如果不是topic,则代表是categories,可递归进行判断,唯一的例外就是Numeric Functions #下面的echo "├── $line"打印出的是categories的名字 for i in `seq $[$number-1]` do echo -ne $format done echo "├── $line" #遇到Numeric Functions,就直接打印出该类中的topic if [ "$line" = "Numeric Functions" ];then sed -i '1d;$d' $name while read functions do for i in `seq $number` do echo -ne $format done echo "├── $functions" done < $name else #其它的categories,递归调用该函数进行判断。 sed -i '1d;$d' $name recursive $name number=$[$number-1] fi fi done < $filename } #主函数 recursive /tmp/test/test.txt #处理完毕,删除文件夹 rm -rf /tmp/test 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/1a691c4f4a7619a51dd5bf803f7b1209.html