# 常用的命令行

edit-by：王进波 2018.08.11

这里对常用的命令只结合一些使用场景介绍，命令的完整参数特性，感兴趣的可以自己去查。

### 日志查看

> `tail -f <filename> `

Linux / Windows

说明：tail 是Linux下的日志查看工具，它最强的特性是可以动态查询最新的日志内容，并在标准输出上打印出来，加上参数 `-f` 后会滚动显示日志文件最底部的内容（也就是最新生成的日志）。

Windows下也有类似的方案，需要借助工具，我这里是推荐使用 `cmder`， 它是一个终端模拟器，包含并扩展了很多Windows自带命令行的功能，在`cmder`中我们就可以使用 ` tail -f <filename>`  命令，就像Linux下的一样。
tail 只从文本中读取最新的一屏的内容，而Windows下用记事本直接打开日志文件会将文件全部读入内存，如果需要实时观察日志而不做全文查询，tail 要节省很多资源。

工具我也上传到Gitlab了，到 [这里](https://civpub.vicp.net:8443/wangjinbo/Svn-to-Git/blob/master/%E5%B7%A5%E5%85%B7/cmder_mini.zip)下载，我上传的是mini版，也可以自己去[官网](http://cmder.net/)下载完整版。

## 命令行切换目录

> `cd /d <path>`

Windows：cmd

说明：Windows下在分区内切换不同目录直接`cd <path>` 就够了，但是当需要跨分区切换时，发现执行了前面的`cd`命令后，命令行里显示的当前路径没有发生变化，这时我们需要在命令中加上`/d`参数，即`cd /d <path>`。

`Powershell`中不需要指定`/d`参数，指定会报错。

## 从命令行打开资源管理器中指定的路径

> `start <path>` 

Windows：cmd，powershell

说明：`start .` 表示打开当前目录，`“.”`号是当前路径的简写，所以`“.”` 也可以替换为明确指定的其他绝对路径和相对路径。`start ..`就是在资源管理器中打开当前路径的父级路径。

这个操作适合你在命令行中工作时，遇到需要打开文件夹操作的时候，敲两个字母就搞定了，比找鼠标打开中`我的电脑` 再一层层定位到你要找的目录要快多了

## 命令行的自动补齐功能

> Tab 键

Linux/Windows

说明：当我们在命令行中要导航到一个目录的时候不可能时时刻刻都记得目录的准确地址，当然Windows下可以用鼠标复制下路径来粘贴到命令行中，但是Linux不装界面的情况下是不能用鼠标的，这时我们可以在写`cd`命令时只写出目录名称的开头一部分，然后按键盘上的`Tab` 键，命令行会依次列举出符合我们输入的目录名称。

例如我需要从`F:\nltk_data\models\moses_sample`导航到`F:\nltk_data\models\moses_sample\phrase-model`这个目录下，我们在`cd`命令中输入`cd phrase`后直接按`Tab`键，命令行就会显示出`cd phrase-model`，如果第一条不是目标目录，就继续按`Tab`键。

Windows的 Powershell 对目录补全支持很好，但是 cmd 命令行就表现的很弱智，按`Tab`始终只能列举当前路径下的子目录。

### 查看磁盘占用

> du | sort | head

- du : 计算出单个文件或者文件夹的磁盘空间占用.
- sort : 对文件行或者标准输出行记录排序后输出.
- head : 输出文件内容的前面部分

用下面的命令找出 `/var` 目录下大小排名前十的目录

```shell
du -a /var | sort -n -r | head -n 10
```

```shell
root@ubuntu:/# du -a / | sort -n -r | head -n 10
10823042	/
7711604	/var
5229488	/var/lib
3993252	/var/lib/mysql
2244688	/var/log
1548216	/usr
1408200	/var/log/syslog.1
1052096	/var/lib/docker
935112	/root
825220	/var/lib/docker/overlay2
```

用下面的命令输出可读性更高的内容

```shell
cd /var
du -hsx * | sort -rh | head -10
```

```sehll
root@ubuntu:/# sudo du -hsx * | sort -rh | head -10
7.4G	var
1.5G	usr
914M	root
208M	lib
166M	swapfile
133M	swap
65M		boot
8.5M	bin
7.4M	sbin
5.3M	run
```

### MySQL 主从复制状态查询

Start the MySQL command-line utility on the slave server:

```shell
# cd /opt/mysql/mysql/bin
# mysql -u root -p
Enter password:
```

Check the replication status using the show slave status command (the status of the slave server is conveyed by the Slave_IO_Running and Slave_SQL_Running column values):

```shell
mysql> SHOW SLAVE STATUS \G;
```

### MySQL slave服务启停

```shell
start slave;
stop slave;
```

### MySQL 8.0 caching_sha2_password认证

MySQL 从8.0 版本以后默认使用 `caching_sha2_password plugin` 进行身份验证，之前的版本默认使用 `mysql_native_password plugin` 进行身份验证的客户端连接 8.0 时会报错，在 `caching_sha2_password plugin` 下修改用户密码的语句如下：

登录后执行

```sql
ALTER USER user
  IDENTIFIED WITH caching_sha2_password
  BY 'password';
```

将密码验证回复成`caching_sha2_password plugin`的语句如下：

登录后执行

```shell
use mysql;
select host,user,plugin from user;
```

打印如下

```shell
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | caching_sha2_password |
+-----------+------------------+-----------------------+
4 rows in set (0.00 sec)
```

执行语句修改plugin为`mysql_native_password plugin` 

```shell
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';  flush privileges;
```

打印如下

```shell
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+
4 rows in set (0.00 sec)
```

### Arch Linux 添加未授信gpg密钥

使用yaourt从 AUR 源码包编译时遇到未知gpg密钥，不允许安装的错误，需要手动将gpg密钥添加到本地授信密钥中。如果你本地已有 gpg密钥对，直接将报错中提示的不可信密钥添加到用户的个人密钥中即可，如下：

```
gpg --recv-keys 5CC908FDB71E12C2
```

> --recv-keys key IDs: Import the keys with the given key IDs from a keyserver.

如果当前用户还没有创建gpg密钥数据库，则手动创建如下：

```
gpg --full-gen-key
```

> -full-gen-key: Generate a new key pair.