经常会遇到这种情况,在一个不能上网的环境通过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.txt
cd /tmp/test
#引入number的作用在于后续格式的输出
number= #后续用了递归调用,这里定义的是函数
function recursive(){
filename=$
number=$[$number+] 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 - $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-]`
do
echo -ne $format
done
echo "├── $line" else
#如果不是topic,则代表是categories,可递归进行判断,唯一的例外就是Numeric Functions
#下面的echo "├── $line"打印出的是categories的名字
for i in `seq $[$number-]`
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-] fi
fi
done < $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],类似于恢复到上一层目录下。