# Linux 常用Shell命令
## 一、Linux目录结构
| 目录名称 | 应放置文件的内容 |
| ----------- | --------------------------------------------------------- |
| /boot | 开机所需文件—内核、开机菜单以及所需配置文件等 |
| /dev | 以文件形式存放任何设备与接口 |
| /etc | 配置文件 |
| /home | 用户主目录 |
| /bin | 存放单用户模式下还可以操作的命令 |
| /lib | 开机时用到的函数库,以及/bin与/sbin下面的命令要调用的函数 |
| /sbin | 开机过程中需要的命令 |
| /media | 用于挂载设备文件的目录 |
| /opt | 放置第三方的软件 |
| /root | 系统管理员的家目录 |
| /srv | 一些网络服务的数据文件目录 |
| /tmp | 任何人均可使用的“共享”临时目录 |
| /proc | 虚拟文件系统,例如系统内核、进程、外部设备及网络状态等 |
| /usr/local | 用户自行安装的软件 |
| /usr/sbin | Linux系统开机时不会使用到的软件/命令/脚本 |
| /usr/share | 帮助与说明文件,也可放置共享文件 |
| /var | 主要存放经常变化的文件,如日志 |
| /lost+found | 当文件系统发生错误时,将一些丢失的文件片段存放在这里 |
## 二、帮助命令
想要查看某个命令的帮助信息,可以使用 man 命令。执行 man 命令后,就进入到浏览页面,浏览页面常用按键如下:
| 按键 | 用处 |
| --------- | ---------------------------------- |
| 空格键 | 向下翻一页 |
| PaGe down | 向下翻一页 |
| PaGe up | 向上翻一页 |
| home | 直接前往首页 |
| end | 直接前往尾页 |
| / | 从上至下搜索某个关键词,如“/linux” |
| ? | 从下至上搜索某个关键词,如“?linux” |
| n | 定位到下一个搜索到的关键词 |
| N | 定位到上一个搜索到的关键词 |
| q | 退出帮助文档 |
## 三、Yum相关命令
| 命令 | 列出所有仓库 |
| ------------------------- | ---------------------------- |
| yum repolist all | 列出所有仓库 |
| yum list all | 列出仓库中所有软件包 |
| yum info 软件包名称 | 查看软件包信息 |
| yum install 软件包名称 | 安装软件包 |
| yum reinstall 软件包名称 | 重新安装软件包 |
| yum update 软件包名称 | 升级软件包 |
| yum remove 软件包名称 | 移除软件包 |
| yum clean all | 清除所有仓库缓存 |
| yum check-update | 检查可更新的软件包 |
| yum grouplist | 查看系统中已经安装的软件包组 |
| yum groupinstall 软件包组 | 安装指定的软件包组 |
| yum groupremove 软件包组 | 移除指定的软件包组 |
| yum groupinfo 软件包组 | 查询指定的软件包组信息 |
## 四、服务相关命令
服务的启动、重启、停止、重载、查看状态等常用命令如下:
| System V init 命令(RHEL 6系统) | systemctl命令(RHEL 7 系统) | 作用 |
| -------------------------------- | ----------------------------- | ------------------------------ |
| service foo start | systemctl start foo.service | 启动服务 |
| service foo restart | systemctl restart foo.service | 重启服务 |
| service foo stop | systemctl stop foo.service | 停止服务 |
| service foo reload | systemctl reload foo.service | 重新加载配置文件(不终止服务) |
| service foo status | systemctl status foo.service | 查看服务状态 |
服务开机启动、不启动、查看各级别下服务启动状态等常用命令:
| System V init 命令(RHEL 6系统) | systemctl命令(RHEL 7 系统) | 作用 |
| -------------------------------- | ---------------------------------------- | ---------------------------------- |
| chkconfig foo in | systemctl enable foo.service | 开机自动启动 |
| chkconfig foo off | systemctl disable foo.service | 开机不自动启动 |
| chkconfig foo | systemctl is-enable foo.service | 查看特定服务是否为开启自动启动 |
| chkconfig --list | systemctl list-unit-files --type=service | 查看各个级别下服务的启动与禁用情况 |
## 五、常用系统命令
### 1. echo
echo 命令用于在终端输出字符串或变量提取后的值,格式为:echo [字符串 | $变量] 。
```shell
[root@hadoop001 ~]# echo hello
hello
[root@hadoop001 ~]# echo $JAVA_HOME
/usr/java/jdk1.8.0_201
```
### 2. date
date 命令用于显示及设置系统的时间或日期。常用参数如下:
| 参数 | 作用 |
| ---- | -------------- |
| %t | 跳格[Tab键] |
| %H | 小时(00~23) |
| %I | 小时(00~12) |
| %M | 分钟(00~59) |
| %S | 秒(00~59) |
| %j | 今年中的第几天 |
按照默认格式查看当前时间:
```shell
[root@hadoop001 ~]# date
2019年 07月 02日 星期二 14:07:34 CST
```
按照“年-月-日 小时:分钟:秒”的格式查看当前系统时间的date命令如下所示:
```shell
[root@hadoop001 ~]# date "+%Y-%m-%d %H:%M:%S"
2019-07-02 14:07:52
```
设置系统时间:
```shell
[root@hadoop001 ~]# date -s "20190702 14:10:10"
2019年 07月 02日 星期二 14:10:10 CST
```
### 3. reboot
reboot 命令用于重启系统,其格式为 reboot。
### 4. poweroff
poweroff 命令用于关闭系统,其格式为 poweroff。
### 5. wget
wget 命令用于在终端中下载网络文件,格式为: wget [参数] 下载地址。 常用参数如下:
| 参数 | 作用 |
| ---- | ------------------------------------ |
| -b | 后台下载模式 |
| -P | 下载到指定目录 |
| -t | 最大尝试次数 |
| -c | 断点续传 |
| -p | 下载页面内所有资源,包括图片、视频等 |
| -r | 递归下载 |
示例下载百度首页的内容到`/usr/baidu`目录下:
```shell
[root@hadoop001 usr]# wget -r -p www.baidu.com -P /usr/baidu
```
### 6. ps
ps 命令用于查看系统中的进程状态,格式为:ps [参数] ,常用参数如下:
| 参数 | 作用 |
| ---- | ---------------------------------- |
| -a | 显示所有进程(包括其他用户的进程) |
| -u | 用户以及其他详细信息 |
| -x | 显示没有控制终端的进程 |
在 Linux 系统中,有5种常见的进程状态,分别为运行、中断、不可中断、僵死与停止:
- **R (运行)** :进程正在运行或在运行队列中等待。
- **S (中断)** :进程处于休眠中,当某个条件形成后或者接收到信号时,则脱离该 状态。
- **D (不可中断)** :进程不响应系统异步信号,即便用kill命令也不能将其中断。
- **Z (僵死)** :进程已经终止,但进程描述符依然存在, 直到父进程调用wait4()系统函数后将进程释放。
- **T (停止)** :进程收到停止信号后停止运行。
示例如下:
```shell
[root@hadoop001 usr]# ps -u
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 2688 0.0 0.0 110092 856 tty1 Ss+ 13:45 0:00 /sbin/agetty --
root 3679 0.0 0.1 115572 2216 pts/0 Ss 13:52 0:00 -bash
root 12471 0.0 0.1 155360 1888 pts/0 R+ 14:17 0:00 ps -u
```
| USER | PID | %CPU | %MEM | VSZ | RSS | TTY | STAT | START | TIME | COMMAND |
| ------------ | -------- | ------------ | ---------- | ------------------------ | -------------------------- | -------- | -------- | ------------ | ----------------- | -------------- |
| 进程的所有者 | 进程ID号 | 运算器占用率 | 内存占用率 | 虚拟内存使用量(单位是KB) | 占用的固定内存量(单位是KB) | 所在终端 | 进程状态 | 被启动的时间 | 实际使用CPU的时间 | 命令名称与参数 |
### 7. top
top 命令用于动态地监视进程活动与系统负载等信息,其格式为 top。
```shell
top - 14:21:25 up 35 min, 1 user, load average: 0.00, 0.02, 0.05
Tasks: 104 total, 1 running, 103 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.5 us, 0.7 sy, 0.0 ni, 98.7 id, 0.0 wa, 0.0 hi, 0.2 si, 0.0 st
KiB Mem : 1882148 total, 1316728 free, 203592 used, 361828 buff/cache
KiB Swap: 2097148 total, 2097148 free, 0 used. 1497748 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3680 root 20 0 113444 1776 1344 S 0.3 0.1 0:06.45 bash
13685 root 20 0 161880 2200 1560 R 0.3 0.1 0:00.09 top
1 root 20 0 193696 6656 4180 S 0.0 0.4 0:03.10 systemd
```
top 命令执行结果的前5行为系统整体的统计信息,其所代表的含义如下:
**第1行**:系统时间、运行时间、登录终端数、系统负载(三个数值分别为1分钟、5分钟、15分钟内的平均值,数值越小意味着负载越低)。
**第2行**:进程总数、运行中的进程数、睡眠中的进程数、停止的进程数、僵死的进程数。
**第3行**:用户占用资源百分比(us)、系统内核占用资源百分比(sy)、改变过优先级的进程资源百分比(ni)、空闲的资源百分比(id)等。其中数据均为CPU数据并以百分比格式显示,例如 `98.7 id` 意味着有 98.7% 的 CPU 处理器资源处于空闲。
**第4行**:物理内存总量、内存使用量、内存空闲量、作为内核缓存的内存量。
**第5行**:虚拟内存总量、虚拟内存使用量、虚拟内存空闲量、已被提前加载的内存量。
### 8. pidof
pidof 命令用于查询某个指定服务进程的 PID 值,格式为:pidof \[参数][服务名称]。
### 9. kill
kill 命令用于终止某个指定 PID 的服务进程,格式为:kill \[参数][进程 PID]。
### 10. killall
killall 命令用于终止某个指定名称的服务所对应的全部进程,格式为:killall \[参数][服务名称]。
## 六、状态检测命令
### 1. ifconfig
ifconfig 命令用于获取网卡配置与网络状态等信息,格式为:ifconfig \[网络设备][参数]。
### 2. uname
uname 命令用于查看系统内核与系统版本等信息,格式为:uname [-a]。-a 参数用来查看详细信息,主要有内核名称、主机名、内核发行版本、节点名、系统时间、硬件名称、硬件平台、处理器类型以及操作系统名称等信息。
```shell
[root@hadoop001 ~]# uname -a
Linux hadoop001 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
```
如果要查看当前系统版本的详细信息,可以使用如下命令:
```shell
[root@hadoop001 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```
### 3. uptime
uptime 用于查看系统的负载信息。显示**当前系统时间**、**系统已运行时间**、**启用终端数量**以及**平均负载值**等信息。平均负载值指的是系统在最近1分钟、5分钟、15分钟内的压力情况。
```shell
[root@hadoop001 ~]# uptime
14:32:06 up 46 min, 1 user, load average: 0.00, 0.01, 0.05
```
### 4. free
free 用于显示当前系统中内存的使用量信息,格式为:free [-h]。 执行`free -h`命令后的输出信息如下:
| | 内存总量 | 已用量 | 可用量 | 进程共享的内存量 | 磁盘缓存的内存量 | 缓存的内存量 |
| ----- | -------- | ------ | ------ | ---------------- | ---------------- | ------------ |
| | total | used | free | shared | buffers | cached |
| Mem: | 1.8G | 198M | 1.3G | 8.5M | 353M | 1.4G |
| Swap: | 2.0G | 0B | 2.0G | | | |
swap 全称为 swap place,即交换区,当内存不够的时候,被踢出的进程被暂时存储到交换区。当需要这条被踢出的进程的时候,就从交换区重新加载到内存,否则它不会主动交换到真实内存中。
### 5. who
who 用于查看当前登入主机的用户终端信息,格式为:who [参数]。
### 6. last
last 命令用于查看所有系统的登录记录,格式为:last [参数]。
### 7. history
history 命令用于显示历史执行过的命令,格式为:history [-c],默认显示最近1000条命令记录。可以使用 `!序号` 的方式来重复执行某条命令。
### 8. sosreport
sosreport 命令用于收集系统配置及架构信息并输出诊断文档。使用时如果找不到该命令,则需要先使用`yum install sos`命令来安装 sos 包。
## 七、目录相关命令
### 1. pwd
显示当前所在的路径信息。
### 2. cd
切换到指定目录,`cd -`命令返回到上一次所处的目录。
### 3. ls
显示当前路径下的文件信息。想要查看文件的详细信息可以使用`ls -l `,也可以简写为`ll`。
## 八、文件编辑命令
### 1. cat
cat 命令用于查看内容较少的纯文本文件,格式为:cat \[选项][文件]。常用参数为`-n`,代表带行号显示。
### 2. more
more 命令用于查看内容较多的纯文本文件,格式为:more [选项]文件。可以使用空格键或回车键向下翻页。
### 3. head
head 命令用于查看纯文本文档的前N行,格式为:head \[选项][文件]。
```shell
head -n 20 hdfs-site.xml
```
### 4. tail
tail 命令用于查看纯文本文档的后N行或持续刷新内容,格式为:tail \[选项][文件]。
```shell
head -n 20 hdfs-site.xml
```
tail 命令可以持续观察一个文件新写入的内容,此时命令为:tail -f 文件名。
### 5. stat
stat 命令用于查看文件的具体存储信息和时间等信息,示例如下:
```shell
[root@hadoop001 hadoop]# stat hdfs-site.xml
文件:"hdfs-site.xml"
大小:1021 块:8 IO 块:4096 普通文件
设备:fd00h/64768d Inode:3305180 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 1106/ UNKNOWN) Gid:( 4001/ UNKNOWN)
环境:unconfined_u:object_r:usr_t:s0
最近访问:2019-07-02 14:50:22.700674460 +0800
最近更改:2019-04-30 16:06:24.421716553 +0800
最近改动:2019-04-30 16:06:24.423716557 +0800
创建时间:-
```
### 6. diff
diff 命令用于比较多个文本文件的差异,格式为:diff [参数] 文件。 常用参数如下:
- 使用`-c`参数来详细比较出多个文件的差异之处 ;
- 使用`--brief`参数来确认两个文件是否不同。
```shell
diff -c diff_A.txt diff_B.txt
diff --brief diff_A.txt diff_B.txt
```
## 九、文件管理命令
### 1. touch
touch 命令用于创建空白文件或设置文件的时间,格式为:touch \[选项][文件]。常用参数如下:
| 参数 | 作用 |
| ---- | ----------------------- |
| -a | 仅修改读取时间(atime) |
| -m | 仅修改修改时间(mtime) |
| -d | 同时修改atime与mtime |
```shell
[root@hadoop001 hadoop]# touch -d "2018-08-08 08:08" hdfs-site.xml
```
### 2. mkdir
mkdir 命令用于创建空白的目录,格式为:mkdir [选项] 目录。常用参数为`-p`,代表递归创建:
```shell
mkdir -p a/b/c/d/e
```
### 3. cp
cp 命令用于复制文件或目录,格式为:`cp [选项] 源文件 目标文件`。 常用参数如下:
| 参数 | 作用 |
| ---- | -------------------------------------------- |
| -p | 保留原始文件的属性 |
| -d | 若对象为“链接文件”,则保留该“链接文件”的属性 |
| -r | 递归持续复制(用于目录) |
| -i | 若目标文件存在则询问是否覆盖 |
| -a | 相当于 -pdr(p、d、r为上述参数) |
### 4. mv
mv 命令用于剪切文件或将文件重命名,格式为:`mv [选项] 源文件 [目标路径|目标文件名]`。 如果在同一个目录中对一个文件进行剪切操作,等价于对其进行重命名:
```shell
mv yarn-site.xml hello.xml
```
### 5. rm
rm 命令用于删除文件或目录,格式为:rm [选项] 文件。 常用参数如下:
- `-f`:参数来强制删除;
- `-r` :参数递归删除文件夹。
### 6. file
file 命令用于查看文件的类型,格式为:file 文件名。
```shell
[root@hadoop001 hadoop]# file yarn-site.xml
yarn-site.xml: XML 1.0 document, UTF-8 Unicode text
```
## 十、压缩与搜索命令
### 1. tar
tar 命令用于对文件进行压缩或解压,格式为:tar \[选项] [文件]。 常用参数如下:
| 参数 | 作用 |
| ---- | ---------------------- |
| -c | 创建压缩文件 |
| -x | 解开压缩文件 |
| -t | 查看压缩包内有哪些文件 |
| -z | 用Gzip压缩或解压 |
| -j | 用bzip2压缩或解压 |
| -v | 显示压缩或解压的过程 |
| -f | 目标文件名 |
| -p | 保留原始的权限与属性 |
| -P | 使用绝对路径来压缩 |
| -C | 指定解压到的目录 |
常用打包命令:`tar -czvf 压缩包名称.tar.gz 要打包的目录`;
常用解压命令:`tar -xzvf 压缩包名称.tar.gz`。
### 2. grep
grep 命令用于执行关键词搜索,并显示匹配的结果,格式为:grep \[选项][文件]。 常用参数如下:
| 参数 | 作用 |
| ---- | ------------------------------------------------ |
| -b | 将可执行文件(binary)当作文本文件(text)来搜索 |
| -c | 仅显示找到的行数 |
| -i | 忽略大小写 |
| -n | 显示行号 |
| -v | 反向选择——仅列出没有关键词的行。 |
```shell
[root@hadoop001 hadoop]# cat core-site.xml | grep hadoop -n
22: