经常会遇到这种情况,在一个不能上网的环境通过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 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],类似于恢复到上一层目录下。