Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选

首页 / 数据库 / MySQL / 如何将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#定义输出的格式, 输出tab,相当于backspace一个空格,参考了tree命令的输出方式。format="| "#删除第一行和最后一行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]`doecho -ne $formatdoneecho "├── $line"else#如果不是topic,则代表是categories,可递归进行判断,唯一的例外就是Numeric Functions#下面的echo "├── $line"打印出的是categories的名字for i in `seq $[$number-1]`doecho -ne $formatdoneecho "├── $line"#遇到Numeric Functions,就直接打印出该类中的topicif [ "$line" = "Numeric Functions" ];thensed -i "1d;$d" $namewhile read functions dofor i in `seq $number`doecho -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 XML|├── 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|| ├── UPDATEXML|| ├── 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],类似于恢复到上一层目录下。本文永久更新链接地址