你的位置:首页 > 数据库

[数据库]如何将MySQL help contents的内容有层次的输出


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

其实,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.txtcd /tmp/test#引入number的作用在于后续格式的输出number=0#后续用了递归调用,这里定义的是函数function recursive(){filename=$1number=$[$number+1]while read linedo#name要做为文件名,譬如Account Management,利用tr函数是去掉字符中间的空格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,递归调用该函数进行判断。sed -i '1d;$d' $namerecursive $namenumber=$[$number-1]fifidone < $filename}#主函数recursive /tmp/test/test.txt#处理完毕,删除文件夹rm -rf /tmp/test

 

因MySQL客户端登录数据库的时候,直接指定了密码,如果直接执行的话,会输出很多“Warning: Using a password on the command line interface can be insecure.”,

可重定向到一个文件

# sh 2.sh > 1.txt 

最后文件中的结果如下:

├── Account Management|   ├── ALTER USER|   ├── CREATE USER|   ├── DROP USER|   ├── GRANT|   ├── RENAME USER|   ├── REVOKE|   ├── SET PASSWORD├── Administration|   ├── BINLOG|   ├── CACHE INDEX|   ├── FLUSH|   ├── FLUSH QUERY CACHE|   ├── HELP COMMAND|   ├── KILL|   ├── LOAD INDEX|   ├── RESET|   ├── SET|   ├── SHOW|   ├── SHOW AUTHORS|   ├── SHOW BINARY LOGS|   ├── SHOW BINLOG EVENTS|   ├── SHOW CHARACTER SET|   ├── SHOW COLLATION|   ├── SHOW COLUMNS|   ├── SHOW CONTRIBUTORS|   ├── SHOW CREATE DATABASE|   ├── SHOW CREATE EVENT|   ├── SHOW CREATE FUNCTION|   ├── SHOW CREATE PROCEDURE|   ├── SHOW CREATE TABLE|   ├── SHOW CREATE TRIGGER|   ├── SHOW CREATE VIEW|   ├── SHOW DATABASES|   ├── SHOW ENGINE|   ├── SHOW ENGINES|   ├── SHOW ERRORS|   ├── SHOW EVENTS|   ├── SHOW FUNCTION CODE|   ├── SHOW FUNCTION STATUS|   ├── SHOW GRANTS|   ├── SHOW INDEX|   ├── SHOW MASTER STATUS|   ├── SHOW OPEN TABLES|   ├── SHOW PLUGINS|   ├── SHOW PRIVILEGES|   ├── SHOW PROCEDURE CODE|   ├── SHOW PROCEDURE STATUS|   ├── SHOW PROCESSLIST|   ├── SHOW PROFILE|   ├── SHOW PROFILES|   ├── SHOW RELAYLOG EVENTS|   ├── SHOW SLAVE HOSTS|   ├── SHOW SLAVE STATUS|   ├── SHOW STATUS|   ├── SHOW TABLE STATUS|   ├── SHOW TABLES|   ├── SHOW TRIGGERS|   ├── SHOW VARIABLES|   ├── SHOW WARNINGS├── Compound Statements|   ├── BEGIN END|   ├── CASE STATEMENT|   ├── CLOSE|   ├── DECLARE CONDITION|   ├── DECLARE CURSOR|   ├── DECLARE HANDLER|   ├── DECLARE VARIABLE|   ├── FETCH|   ├── GET DIAGNOSTICS|   ├── IF STATEMENT|   ├── ITERATE|   ├── LABELS|   ├── LEAVE|   ├── LOOP|   ├── OPEN|   ├── REPEAT LOOP|   ├── RESIGNAL|   ├── RETURN|   ├── SIGNAL|   ├── WHILE├── Data Definition|   ├── ALTER DATABASE|   ├── ALTER EVENT|   ├── ALTER FUNCTION|   ├── ALTER LOGFILE GROUP|   ├── ALTER PROCEDURE|   ├── ALTER SERVER|   ├── ALTER TABLE|   ├── ALTER TABLESPACE|   ├── ALTER VIEW|   ├── CONSTRAINT|   ├── CREATE DATABASE|   ├── CREATE EVENT|   ├── CREATE FUNCTION|   ├── CREATE INDEX|   ├── CREATE LOGFILE GROUP|   ├── CREATE PROCEDURE|   ├── CREATE SERVER|   ├── CREATE TABLE|   ├── CREATE TABLESPACE|   ├── CREATE TRIGGER|   ├── CREATE VIEW|   ├── DROP DATABASE|   ├── DROP EVENT|   ├── DROP FUNCTION|   ├── DROP INDEX|   ├── DROP PROCEDURE|   ├── DROP SERVER|   ├── DROP TABLE|   ├── DROP TABLESPACE|   ├── DROP TRIGGER|   ├── DROP VIEW|   ├── RENAME TABLE|   ├── TRUNCATE TABLE├── Data Manipulation|   ├── CALL|   ├── DELETE|   ├── DO|   ├── DUAL|   ├── HANDLER|   ├── INSERT|   ├── INSERT DELAYED|   ├── INSERT SELECT|   ├── JOIN|   ├── LOAD DATA|   ├── LOAD |   ├── REPLACE|   ├── SELECT|   ├── UNION|   ├── UPDATE├── Data Types|   ├── AUTO_INCREMENT|   ├── BIGINT|   ├── BINARY|   ├── BIT|   ├── BLOB|   ├── BLOB DATA TYPE|   ├── BOOLEAN|   ├── CHAR|   ├── CHAR BYTE|   ├── DATE|   ├── DATETIME|   ├── DEC|   ├── DECIMAL|   ├── DOUBLE|   ├── DOUBLE PRECISION|   ├── ENUM|   ├── FLOAT|   ├── INT|   ├── INTEGER|   ├── LONGBLOB|   ├── LONGTEXT|   ├── MEDIUMBLOB|   ├── MEDIUMINT|   ├── MEDIUMTEXT|   ├── SET DATA TYPE|   ├── SMALLINT|   ├── TEXT|   ├── TIME|   ├── TIMESTAMP|   ├── TINYBLOB|   ├── TINYINT|   ├── TINYTEXT|   ├── VARBINARY|   ├── VARCHAR|   ├── YEAR DATA TYPE├── Functions|   ├── Bit Functions|   |    ├── &|   |    ├── <<|   |    ├── >>|   |    ├── BIT_COUNT|   |    ├── ^|   |    ├── ||   |    ├── ~|   ├── Comparison operators|   |    ├── !=|   |    ├── <|   |    ├── <=|   |    ├── <=>|   |    ├── =|   |    ├── >|   |    ├── >=|   |    ├── BETWEEN AND|   |    ├── COALESCE|   |    ├── GREATEST|   |    ├── IN|   |    ├── INTERVAL|   |    ├── IS|   |    ├── IS NOT|   |    ├── IS NOT NULL|   |    ├── IS NULL|   |    ├── ISNULL|   |    ├── LEAST|   |    ├── NOT BETWEEN|   |    ├── NOT IN|   ├── Control flow functions|   |    ├── CASE OPERATOR|   |    ├── IF FUNCTION|   |    ├── IFNULL|   |    ├── NULLIF|   ├── Date and Time Functions|   |    ├── ADDDATE|   |    ├── ADDTIME|   |    ├── CONVERT_TZ|   |    ├── CURDATE|   |    ├── CURRENT_DATE|   |    ├── CURRENT_TIME|   |    ├── CURRENT_TIMESTAMP|   |    ├── CURTIME|   |    ├── DATE FUNCTION|   |    ├── DATEDIFF|   |    ├── DATE_ADD|   |    ├── DATE_FORMAT|   |    ├── DATE_SUB|   |    ├── DAY|   |    ├── DAYNAME|   |    ├── DAYOFMONTH|   |    ├── DAYOFWEEK|   |    ├── DAYOFYEAR|   |    ├── EXTRACT|   |    ├── FROM_DAYS|   |    ├── FROM_UNIXTIME|   |    ├── GET_FORMAT|   |    ├── HOUR|   |    ├── LAST_DAY|   |    ├── LOCALTIME|   |    ├── LOCALTIMESTAMP|   |    ├── MAKEDATE|   |    ├── MAKETIME|   |    ├── MICROSECOND|   |    ├── MINUTE|   |    ├── MONTH|   |    ├── MONTHNAME|   |    ├── NOW|   |    ├── PERIOD_ADD|   |    ├── PERIOD_DIFF|   |    ├── QUARTER|   |    ├── SECOND|   |    ├── SEC_TO_TIME|   |    ├── STR_TO_DATE|   |    ├── SUBDATE|   |    ├── SUBTIME|   |    ├── SYSDATE|   |    ├── TIME FUNCTION|   |    ├── TIMEDIFF|   |    ├── TIMESTAMP FUNCTION|   |    ├── TIMESTAMPADD|   |    ├── TIMESTAMPDIFF|   |    ├── TIME_FORMAT|   |    ├── TIME_TO_SEC|   |    ├── TO_DAYS|   |    ├── TO_SECONDS|   |    ├── UNIX_TIMESTAMP|   |    ├── UTC_DATE|   |    ├── UTC_TIME|   |    ├── UTC_TIMESTAMP|   |    ├── WEEK|   |    ├── WEEKDAY|   |    ├── WEEKOFYEAR|   |    ├── YEAR|   |    ├── YEARWEEK|   ├── Encryption Functions|   |    ├── AES_DECRYPT|   |    ├── AES_ENCRYPT|   |    ├── COMPRESS|   |    ├── DECODE|   |    ├── DES_DECRYPT|   |    ├── DES_ENCRYPT|   |    ├── ENCODE|   |    ├── ENCRYPT|   |    ├── MD5|   |    ├── OLD_PASSWORD|   |    ├── PASSWORD|   |    ├── RANDOM_BYTES|   |    ├── SHA1|   |    ├── SHA2|   |    ├── UNCOMPRESS|   |    ├── UNCOMPRESSED_LENGTH|   |    ├── VALIDATE_PASSWORD_STRENGTH|   ├── Information Functions|   |    ├── BENCHMARK|   |    ├── CHARSET|   |    ├── COERCIBILITY|   |    ├── COLLATION|   |    ├── CONNECTION_ID|   |    ├── CURRENT_USER|   |    ├── DATABASE|   |    ├── FOUND_ROWS|   |    ├── LAST_INSERT_ID|   |    ├── ROW_COUNT|   |    ├── SCHEMA|   |    ├── SESSION_USER|   |    ├── SYSTEM_USER|   |    ├── USER|   |    ├── VERSION|   ├── Logical operators|   |    ├── !|   |    ├── AND|   |    ├── ASSIGN-EQUAL|   |    ├── ASSIGN-VALUE|   |    ├── OR|   |    ├── XOR|   ├── Miscellaneous Functions|   |    ├── DEFAULT|   |    ├── GET_LOCK|   |    ├── INET6_ATON|   |    ├── INET6_NTOA|   |    ├── INET_ATON|   |    ├── INET_NTOA|   |    ├── IS_FREE_LOCK|   |    ├── IS_IPV4|   |    ├── IS_IPV4_COMPAT|   |    ├── IS_IPV4_MAPPED|   |    ├── IS_IPV6|   |    ├── IS_USED_LOCK|   |    ├── MASTER_POS_WAIT|   |    ├── NAME_CONST|   |    ├── RELEASE_LOCK|   |    ├── SLEEP|   |    ├── UUID|   |    ├── UUID_SHORT|   |    ├── VALUES|   ├── Numeric Functions|   |    ├── %|   |    ├── *|   |    ├── +|   |    ├── - BINARY|   |    ├── - UNARY|   |    ├── /|   |    ├── ABS|   |    ├── ACOS|   |    ├── ASIN|   |    ├── ATAN|   |    ├── ATAN2|   |    ├── CEIL|   |    ├── CEILING|   |    ├── CONV|   |    ├── COS|   |    ├── COT|   |    ├── CRC32|   |    ├── DEGREES|   |    ├── DIV|   |    ├── EXP|   |    ├── FLOOR|   |    ├── LN|   |    ├── LOG|   |    ├── LOG10|   |    ├── LOG2|   |    ├── MOD|   |    ├── PI|   |    ├── POW|   |    ├── POWER|   |    ├── RADIANS|   |    ├── RAND|   |    ├── ROUND|   |    ├── SIGN|   |    ├── SIN|   |    ├── SQRT|   |    ├── TAN|   |    ├── TRUNCATE|   ├── String Functions|   |    ├── ASCII|   |    ├── BIN|   |    ├── BINARY OPERATOR|   |    ├── BIT_LENGTH|   |    ├── CAST|   |    ├── CHAR FUNCTION|   |    ├── CHARACTER_LENGTH|   |    ├── CHAR_LENGTH|   |    ├── CONCAT|   |    ├── CONCAT_WS|   |    ├── CONVERT|   |    ├── ELT|   |    ├── EXPORT_SET|   |    ├── EXTRACTVALUE|   |    ├── FIELD|   |    ├── FIND_IN_SET|   |    ├── FORMAT|   |    ├── FROM_BASE64()|   |    ├── HEX|   |    ├── INSERT FUNCTION|   |    ├── INSTR|   |    ├── LCASE|   |    ├── LEFT|   |    ├── LENGTH|   |    ├── LIKE|   |    ├── LOAD_FILE|   |    ├── LOCATE|   |    ├── LOWER|   |    ├── LPAD|   |    ├── LTRIM|   |    ├── MAKE_SET|   |    ├── MATCH AGAINST|   |    ├── MID|   |    ├── NOT LIKE|   |    ├── NOT REGEXP|   |    ├── OCT|   |    ├── OCTET_LENGTH|   |    ├── ORD|   |    ├── POSITION|   |    ├── QUOTE|   |    ├── REGEXP|   |    ├── REPEAT FUNCTION|   |    ├── REPLACE FUNCTION|   |    ├── REVERSE|   |    ├── RIGHT|   |    ├── RPAD|   |    ├── RTRIM|   |    ├── SOUNDEX|   |    ├── SOUNDS LIKE|   |    ├── SPACE|   |    ├── STRCMP|   |    ├── SUBSTR|   |    ├── SUBSTRING|   |    ├── SUBSTRING_INDEX|   |    ├── TO_BASE64()|   |    ├── TRIM|   |    ├── UCASE|   |    ├── UNHEX|   |    ├── UPDATE|   |    ├── UPPER|   |    ├── WEIGHT_STRING├── Functions and Modifiers for Use with GROUP BY|   ├── AVG|   ├── BIT_AND|   ├── BIT_OR|   ├── BIT_XOR|   ├── COUNT|   ├── COUNT DISTINCT|   ├── GROUP_CONCAT|   ├── MAX|   ├── MIN|   ├── STD|   ├── STDDEV|   ├── STDDEV_POP|   ├── STDDEV_SAMP|   ├── SUM|   ├── VARIANCE|   ├── VAR_POP|   ├── VAR_SAMP├── Geographic Features|   ├── GEOMETRY|   ├── GEOMETRY HIERARCHY|   ├── SPATIAL|   ├── Geometry constructors|   |    ├── GEOMETRYCOLLECTION|   |    ├── LINESTRING|   |    ├── MULTILINESTRING|   |    ├── MULTIPOINT|   |    ├── MULTIPOLYGON|   |    ├── POINT|   |    ├── POLYGON|   ├── Geometry properties|   |    ├── DIMENSION|   |    ├── ENVELOPE|   |    ├── GEOMETRYTYPE|   |    ├── ISEMPTY|   |    ├── ISSIMPLE|   |    ├── SRID|   |    ├── ST_DIMENSION|   |    ├── ST_ENVELOPE|   |    ├── ST_GEOMETRYTYPE|   |    ├── ST_ISEMPTY|   |    ├── ST_ISSIMPLE|   |    ├── ST_SRID|   ├── Geometry relations|   |    ├── CONTAINS|   |    ├── CROSSES|   |    ├── DISJOINT|   |    ├── EQUALS|   |    ├── INTERSECTS|   |    ├── OVERLAPS|   |    ├── ST_CONTAINS|   |    ├── ST_CROSSES|   |    ├── ST_DISJOINT|   |    ├── ST_DISTANCE|   |    ├── ST_EQUALS|   |    ├── ST_INTERSECTS|   |    ├── ST_OVERLAPS|   |    ├── ST_TOUCHES|   |    ├── ST_WITHIN|   |    ├── TOUCHES|   |    ├── WITHIN|   ├── LineString properties|   |    ├── ENDPOINT|   |    ├── GLENGTH|   |    ├── ISCLOSED|   |    ├── NUMPOINTS|   |    ├── POINTN|   |    ├── STARTPOINT|   |    ├── ST_ENDPOINT|   |    ├── ST_ISCLOSED|   |    ├── ST_NUMPOINTS|   |    ├── ST_POINTN|   |    ├── ST_STARTPOINT|   ├── MBR|   |    ├── ASYMMETRIC_DECRYPT|   |    ├── ASYMMETRIC_DERIVE|   |    ├── ASYMMETRIC_ENCRYPT|   |    ├── ASYMMETRIC_SIGN|   |    ├── ASYMMETRIC_VERIFY|   |    ├── CREATE_ASYMMETRIC_PRIV_KEY|   |    ├── CREATE_ASYMMETRIC_PUB_KEY|   |    ├── CREATE_DH_PARAMETERS|   |    ├── CREATE_DIGEST|   |    ├── GTID_SUBSET|   |    ├── GTID_SUBTRACT|   |    ├── MBR DEFINITION|   |    ├── MBRCONTAINS|   |    ├── MBRDISJOINT|   |    ├── MBREQUAL|   |    ├── MBRINTERSECTS|   |    ├── MBROVERLAPS|   |    ├── MBRTOUCHES|   |    ├── MBRWITHIN|   |    ├── SQL_THREAD_WAIT_AFTER_GTIDS|   |    ├── WAIT_UNTIL_SQL_THREAD_AFTER_GTIDS|   ├── Point properties|   |    ├── ST_X|   |    ├── ST_Y|   |    ├── X|   |    ├── Y|   ├── Polygon properties|   |    ├── AREA|   |    ├── CENTROID|   |    ├── EXTERIORRING|   |    ├── INTERIORRINGN|   |    ├── NUMINTERIORRINGS|   |    ├── ST_AREA|   |    ├── ST_CENTROID|   |    ├── ST_EXTERIORRING|   |    ├── ST_INTERIORRINGN|   |    ├── ST_NUMINTERIORRINGS|   ├── WKB|   |    ├── ASBINARY|   |    ├── ASTEXT|   |    ├── GEOMCOLLFROMWKB|   |    ├── GEOMFROMWKB|   |    ├── LINEFROMWKB|   |    ├── MLINEFROMWKB|   |    ├── MPOINTFROMWKB|   |    ├── MPOLYFROMWKB|   |    ├── POINTFROMWKB|   |    ├── POLYFROMWKB|   |    ├── ST_ASBINARY|   |    ├── ST_ASTEXT|   |    ├── ST_GEOMCOLLFROMWKB|   |    ├── ST_GEOMFROMWKB|   |    ├── ST_LINEFROMWKB|   |    ├── ST_POINTFROMWKB|   |    ├── ST_POLYFROMWKB|   ├── WKT|   |    ├── GEOMCOLLFROMTEXT|   |    ├── GEOMFROMTEXT|   |    ├── LINEFROMTEXT|   |    ├── MLINEFROMTEXT|   |    ├── MPOINTFROMTEXT|   |    ├── MPOLYFROMTEXT|   |    ├── POINTFROMTEXT|   |    ├── POLYFROMTEXT|   |    ├── ST_GEOMCOLLFROMTEXT|   |    ├── ST_GEOMFROMTEXT|   |    ├── ST_LINEFROMTEXT|   |    ├── ST_POINTFROMTEXT|   |    ├── ST_POLYFROMTEXT|   |    ├── WKT DEFINITION├── Help Metadata|   ├── HELP_DATE|   ├── HELP_VERSION├── Language Structure├── Plugins├── Procedures├── Storage Engines├── Table Maintenance|   ├── ANALYZE TABLE|   ├── CHECK TABLE|   ├── CHECKSUM TABLE|   ├── OPTIMIZE TABLE|   ├── REPAIR TABLE├── Transactions|   ├── CHANGE MASTER TO|   ├── DEALLOCATE PREPARE|   ├── EXECUTE STATEMENT|   ├── ISOLATION|   ├── LOCK|   ├── PREPARE|   ├── PURGE BINARY LOGS|   ├── RESET MASTER|   ├── RESET SLAVE|   ├── SAVEPOINT|   ├── SET GLOBAL SQL_SLAVE_SKIP_COUNTER|   ├── SET SQL_LOG_BIN|   ├── START SLAVE|   ├── START TRANSACTION|   ├── STOP SLAVE|   ├── XA├── User-Defined Functions|   ├── CREATE FUNCTION UDF|   ├── DROP FUNCTION UDF├── Utility|   ├── EXPLAIN|   ├── HELP STATEMENT|   ├── USE

 

总结:

整个脚本在写的过程有两点比较有意思。

1. 函数递归操作,以前没怎么使用Shell进行函数的递归操作。

2. 借鉴tree的输出格式,对结果进行格式化输出。

思路如下:首先定义一个number为0,每次进入一次recursive函数,都会把当前的number加1,如果只是这样的话,那number值将一直增长了,所以在上述脚本else调用recursive函数部分,会在其后执行number=$[$number-1],类似于恢复到上一层目录下。