爱程序网

如何将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="|tb"#删除第一行和最后一行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 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],类似于恢复到上一层目录下。

关于爱程序网 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助