目录
[1. ls 指令](#1. ls 指令)
[2. pwd 指令](#2. pwd 指令)
[3. cd 指令](#3. cd 指令)
[4. touch 指令](#4. touch 指令)
[5. mkdir 指令](#5. mkdir 指令)
[6. rm 指令](#6. rm 指令)
[7. cp 指令](#7. cp 指令)
[7.1 scp 指令](#7.1 scp 指令)
[8. mv 指令](#8. mv 指令)
[9. echo 指令](#9. echo 指令)
[常用转义字符(需配合 - e 选项):](#常用转义字符(需配合 - e 选项):)
[10. cat 指令](#10. cat 指令)
[11. 输出重定向、输入重定向、追加重定向](#11. 输出重定向、输入重定向、追加重定向)
[1. 标准输出重定向(>,覆盖式)](#1. 标准输出重定向(>,覆盖式))
[2. 标准输出追加重定向(>>,追加式)](#2. 标准输出追加重定向(>>,追加式))
[3. 标准错误输出重定向](#3. 标准错误输出重定向)
[4. 标准输出 + 错误输出合并重定向](#4. 标准输出 + 错误输出合并重定向)
[5. 标准输入重定向(<)](#5. 标准输入重定向(<))
[12. more 指令](#12. more 指令)
[13. less 指令](#13. less 指令)
[14. head 指令](#14. head 指令)
[15. tail 指令](#15. tail 指令)
[16. man 指令](#16. man 指令)
[17. find 指令](#17. find 指令)
[18. which 指令](#18. which 指令)
[19. alias 指令](#19. alias 指令)
[20. grep 指令](#20. grep 指令)
[21. 管道 |](#21. 管道 |)
[22. zip /unzip 指令](#22. zip /unzip 指令)
[zip 指令(压缩)](#zip 指令(压缩))
[unzip 指令(解压)](#unzip 指令(解压))
[zip/unzip 通用注意事项:](#zip/unzip 通用注意事项:)
[23. tar 指令](#23. tar 指令)
[24. bc 指令](#24. bc 指令)
[1. uname 指令(含 uname -r 核心用法)](#1. uname 指令(含 uname -r 核心用法))
[2. free 指令](#2. free 指令)
[3. df 指令](#3. df 指令)
[4. lscpu 指令](#4. lscpu 指令)
[1. date 指令](#1. date 指令)
[2. cal 指令](#2. cal 指令)
一、基本指令
1. ls 指令
语法:ls [选项] [文件或者目录名]
功能:对于目录,该命令列出该目录下的所有子目录与文件。对于文件,将列出文件名以及其他信息。
基本用法:
- 直接输入 ls,会列出当前目录下的可见文件和子目录(不包含隐藏文件),按字母顺序排列,以空格分隔。
- 指定目录:在 ls 后加上目录路径,可列出该目录下的内容。
可跟选项:
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-l 列出文件的详细信息。常将ls -l 简写为ll
-d将目录象文件一样显示,而不是显示其下的文件。 如:ls --d 指定目录
-i 输出文件的 i 节点的索引信息。 如 ls --ai 指定文件
-k以 k 字节的形式表示文件的大小。ls --alk 指定文件
-n用数字的 UID,GID 代替名称。 (介绍 UID, GID)
-F 在每个文件名后附上一个字符以说明该文件的类型,"*"表示可执行的普通文件;"/"表示目录;"@"表示符号链接;"|"表示FIFOs;"="表示套接字(sockets)。(目录类型识别)
-r 对目录反向排序。
-t以时间排序。
-s 在l文件名后输出该文件的大小。(大小排序,如何找到目录下最大的文件)
-R 列出所有子目录下的文件。(递归)
-1 一行只输出一个文件。
注:
像 ls 这种可以附带选项的指令,后面可以同时跟多个选项,如:
ls -la
ls -al
ls -a -l
这三种写法是等价的,都是可以的。
2. pwd 指令
语法:pwd
**功能:**当你在终端中操作时,始终处于某个目录下(称为 "当前工作目录"),pwd 命令会直接输出这个目录的 完整绝对路径,帮你明确自己的操作位置。
可跟选项:
-P(物理路径,默认不常用)显示 实际物理路径,会自动解析路径中的 "符号链接"(软链接),输出其指向的真实目录路径。
假设创建了一个软链接 link_doc 指向 documents,进入 link_doc 后
-L(逻辑路径,默认行为)显示 逻辑路径,即包含符号链接名称的路径(不解析软链接),这是 pwd 的默认行为(不写选项时等同于 -L)。假设创建了一个软链接 link_doc 指向 documents,进入 link_doc 后
3. cd 指令
语法:cd [目录路径]
其中 [目录路径] 是需要切换到的目标目录,可以是 绝对路径 或 相对路径(若省略路径,默认切换到用户的家目录)。
功能::改变工作目录,将当前工作目录改变到指定的目录下。
基本用法:
1. 切换到指定目录(绝对路径)
绝对路径 是从系统根目录
/开始的完整路径(比如/home/user/documents),无论当前在哪个目录,使用绝对路径都能准确切换。
2. 切换到指定目录(相对路径)相对路径 是相对于当前目录的路径(比如
./documents或../images),依赖于当前所在位置。
.表示 当前目录(可省略);..表示 父目录(当前目录的上一级目录)。假设当前在 /home/your_username 目录:
常见用法:
cd(无参数): 直接切换到 当前用户的家目录 (家目录路径通常为/home/用户名或/Users/用户名)cd .. : 返回上级目录
cd ~:进入用户家目
cd -:返回最近访问目录
4. touch 指令
语法:touch [选项] [文件名]
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
基本用法:
1. 创建空文件(最常用)
在当前目录创建一个指定名称的空文件,若文件已存在则仅更新时间戳(不影响内容)。
2. 一次性创建多个空文件语法:
touch 文件1 文件2 ... 文件N通过空格分隔多个文件名,可批量创建空文件。
3. 修改文件的时间戳(进阶功能)Linux 中每个文件有三个关键时间戳(可通过 ls -l 或 stat 文件名 查看)
- 访问时间(atime):最后一次读取文件的时间;
- 修改时间(mtime):最后一次修改文件内容的时间(ls -l 默认显示此时间);
- 状态改变时间(ctime):最后一次修改文件元数据(如权限、名称)的时间(自动更新,无法直接通过 touch 修改)。
可跟选项:
- -a 仅更新文件的 访问时间(atime),不改变修改时间(mtime)。
- -m 仅更新文件的 修改时间(mtime),不改变访问时间(atime)。
- -d "时间"自定义时间戳(同时更新 atime 和 mtime),支持多种时间格式(如 2023-10-01、1 hour ago)。
- -t 时间以 YYYYMMDDhhmm.ss 格式指定时间(精确到秒),例如 202310011230.45 表示 2023 年 10 月 1 日 12:30:45。
- -r 参考文件让目标文件的时间戳与 "参考文件" 保持一致(复制参考文件的 atime 和 mtime)。
注意事项:
- 创建文件时,若指定路径中的目录不存在(如 touch /a/b/c.txt 中 /a/b 不存在),会报错,需先通过 mkdir -p 指令创建目录。
- 对已存在的文件使用 touch 不会删除或修改其内容,仅更新时间戳。
5. mkdir 指令
语法:mkdir [选项] [目录名]
功能:在指定路径下创建新的目录,支持创建单个目录、多个目录,或通过选项创建嵌套的多级目录。
基本用法:
1. 创建单个目录
在当前目录下创建一个指定名称的新目录。
2. 一次性创建多个目录语法:
mkdir 目录1 目录2 ... 目录N,通过空格分隔多个目录名,可批量创建多个同级目录。
可跟选项:
1.
-p(创建嵌套目录,自动补全父目录)(最常用)当需要创建 多级嵌套目录 时,若中间的父目录不存在,
-p会自动创建所有缺失的父目录,避免手动逐级创建。2.
-m(创建目录时指定权限)默认情况下,新目录的权限由系统的
umask配置决定(通常是755或775)。-m选项可直接指定目录的权限(用数字权限表示,如755、700等)。3.
-v(显示创建过程,verbose 模式)创建目录时输出详细信息,显示每个目录的创建过程,适合确认是否按预期创建。
注意事项:
- 若目标目录 已存在 ,直接执行
mkdir会报错(如mkdir: 无法创建目录 'test': 文件已存在),此时可忽略或删除已有目录后重试。- 创建目录时,需确保对 父目录有写入权限 ,否则会报错,例如,普通用户无法在
/root目录下创建子目录(需管理员权限)。- 目录名若包含 空格或特殊字符 (如空格、
&、*),需用引号包裹或用反斜杠\转义:
6. rm 指令
语法:rm [选项] [文件名]
**功能:**核心作用是删除指定的文件或目录,默认情况下:
- 可直接删除 文件;
- 需配合选项才能删除 目录(防止误删);
- 删除后的数据通常不会进入 "回收站",直接从文件系统中移除(难以恢复,需特别小心)。
基本用法:
1. 删除文件
语法:
rm [选项] 文件名直接删除指定文件,支持同时删除多个文件(空格分隔)。
2. 删除目录(必须用 -r 或 -R 选项)rm 默认无法删除目录,需使用 -r(递归)选项,强制删除目录及其所有内容(包括子目录和文件)。
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
-f |
强制删除:忽略不存在的文件,不提示确认(即使文件是只读的也直接删除)。 | 减少交互,但可能误删重要文件(无提醒)。 |
-i |
交互模式 :删除前逐一提示确认(输入 y 确认删除,n 取消)。 |
增加安全性,适合删除重要文件时使用。 |
-r/-R |
递归删除:删除目录及其所有子目录和文件(必须用于删除目录)。 | 若目录包含大量文件,删除后难以恢复;配合 -f 风险极高。 |
-v |
详细模式:显示删除过程(每个被删除的文件 / 目录都会被列出)。 | 便于确认删除范围,适合批量操作时检查。 |
常用选项组合:
rm -i file.txt :删除 file.txt 前提示确认(安全操作)。
rm -f *.tmp :强制删除当前目录所有 .tmp 后缀的文件(不提示,适合清理临时文件)。
rm -rv old_data/ :递归删除 old_data 目录,同时显示删除的每个文件 / 子目录
rm -rf 目录名 :最危险的组合,递归强制删除目录及其所有内容,无任何提示,一旦误操作**(如删除系统目录)可能导致系统崩溃。**
严禁执行的操作:
现代 Linux 系统默认启用
--preserve-root保护机制,会阻止直接删除根目录,但仍需警惕类似的危险路径(如/home、/etc等)。
注意事项:
- 删除即永久 :
rm删除的文件通常不会进入 "回收站",除非系统有特殊配置(如部分桌面环境对图形界面操作的文件有保护),终端中用rm删除后几乎无法恢复,操作前务必确认路径。- 权限问题 :删除文件 / 目录时,需对其父目录有 写入权限 ,否则会报错
rm: 无法删除 'xxx': 权限不够(可用sudo提升权限,但需更谨慎)。- 通配符风险 :使用通配符(如
*、?)时需格外小心,例如rm *.txt会删除所有.txt文件,若误写为rm *txt可能删除非预期文件。- 替代方案 :重要文件建议先移动到临时目录(如
mkdir ~/trash && mv file.txt ~/trash),确认无需后再删除,降低误删风险。
7. cp 指令
语法:cp [选项] 源文件 / 目录 目标文件 / 目录
功能:核心作用是复制指定的文件或目录,默认情况下:
- 可直接复制单个 / 多个文件;
- 需配合选项才能复制目录(防止递归复制遗漏子目录及文件);
- 复制后源文件 / 目录保持不变,目标路径生成完全一致的副本,默认同名文件会提示是否覆盖。
基本用法:
复制文件语法:cp [选项] 源文件 目标路径 / 目标文件名直接复制指定文件到目标路径,支持同时复制多个文件(空格分隔),目标路径需已存在。
cp note.txt /home/user/doc/ # 复制当前目录下的note.txt到doc目录
cp a.txt b.txt /tmp/ # 同时复制当前目录的a.txt和b.txt到/tmp目录
cp note.txt note_bak.txt # 在当前目录复制文件,并重命名为note_bak.txt复制目录(必须用 -r 或 -R 选项)cp 默认无法复制目录,需使用 -r(递归)选项,复制目录及其所有内容(包括子目录和所有文件)。
cp -r docs /home/user/backup/ # 复制docs目录及其内部所有文件和子目录到backup目录
cp -r dir1 dir2 /tmp/ # 同时复制dir1和dir2两个目录及其内容到/tmp目录
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
| -f | 强制复制:忽略不存在的文件,强制覆盖目标同名文件,无提示确认 | 减少交互,但可能误覆盖重要文件,无二次确认,需谨慎使用 |
| -i | 交互模式:覆盖前逐一提示确认(输入 y 确认覆盖,n 取消) | 增加安全性,适合复制重要文件、避免误覆盖时使用 |
| -r/-R | 递归复制:复制目录及其所有子目录和文件(必须用于复制目录) | 若目录包含大量文件,会占用双倍磁盘空间;配合 - f 风险极高 |
| -p | 保留属性:复制时保留文件的原权限、所有者、时间戳等属性 | 适合备份场景,避免复制后文件权限、属性发生变更 |
| -a | 归档复制:等同于 - dpR,递归复制的同时,保留所有文件属性、链接属性 | 系统备份、全量复制的首选选项,完整保留文件所有特性 |
| -v | 详细模式:显示复制过程(每个被复制的文件 / 目录都会被列出) | 便于确认复制范围,适合批量操作时检查、调试 |
| -n | 不覆盖:复制时跳过已存在的同名文件,不执行覆盖 | 安全选项,增量复制、避免误覆盖已有文件时使用 |
| -u | 更新复制:仅当源文件比目标文件新,或目标文件不存在时才执行复制 | 适合增量备份、同步更新文件,避免重复复制无变化的内容 |
常用选项组合:
cp -i note.txt /tmp/ # 复制note.txt到/tmp目录,覆盖前提示确认(安全操作)
cp -rf docs/ /home/backup/ # 强制递归复制docs目录到backup目录,无提示覆盖同名文件
cp -av project/ /opt/backup/ # 归档复制project目录,保留所有属性,同时显示复制过程
cp -u *.log /home/log_bak/ # 仅复制更新过的.log文件到备份目录,无变化的文件跳过
cp -pn *.conf /etc/ # 复制.conf配置文件,保留原文件属性,不覆盖已存在的文件
严禁执行的操作:
# 严禁无校验的强制覆盖系统核心目录
cp -rf /tmp/malicious/* /etc/ # 强制覆盖系统配置目录,会导致系统配置异常、服务崩溃甚至无法启动
cp -rf test/* / # 直接复制文件到根目录,会覆盖系统核心文件,导致系统瘫痪
注意事项:
- 复制即副本:cp 复制后会生成独立的文件副本,修改源文件不会影响目标副本,反之亦然;硬链接复制除外。
- 权限问题:复制文件 / 目录时,需对源文件有读取权限,对目标目录有写入权限,权限不够可用 sudo 提升权限,但需更谨慎。
- 同名文件处理:不同 Linux 发行版默认行为不同,部分系统默认 cp 会直接覆盖同名文件,建议重要文件复制固定加 - i 选项,避免误覆盖。
- 目录复制规范:复制目录时,目标路径末尾是否带 / 会影响结果:
cp -r docs /backup会把 docs 目录复制到 backup 下;cp -r docs/ /backup会把 docs 内的所有文件复制到 backup 下,操作前务必确认路径。- 大文件复制:复制超大文件或海量小文件时,建议加 - v 选项查看进度,或使用 rsync 替代,避免终端无响应误以为卡死。
7.1 scp 指令
语法:scp [选项] 源文件 / 目录 目标文件 / 目录
功能:核心作用是基于 SSH 协议,在本地主机与远程主机之间安全加密地传输文件或目录,默认情况下:
- 传输过程全程加密,数据安全性高,替代传统不安全的 rcp 命令;
- 支持三种传输模式:本地文件 / 目录传到远程、远程文件 / 目录传到本地、远程文件 / 目录传到另一远程;
- 需远程主机开启 SSH 服务(默认端口 22),且用户对远程路径有读写权限;
- 传输目录需配合递归选项,否则仅传输单个文件。
基本用法:
本地文件传到远程主机语法:scp [选项] 本地文件 远程用户名 @远程 IP: 远程目标路径将本地文件上传到远程主机的指定路径,远程路径需已存在。
scp note.txt root@192.168.1.100:/home/user/doc/ # 将本地note.txt上传到192.168.1.100的doc目录
scp /home/user/a.log user@10.0.0.5:/tmp/ # 将本地a.log上传到10.0.0.5的/tmp目录远程文件传到本地主机语法:scp [选项] 远程用户名 @远程 IP: 远程源文件 本地目标路径将远程主机的文件下载到本地的指定路径,本地路径需已存在。
scp root@192.168.1.100:/var/log/nginx/access.log ./ # 将远程access.log下载到本地当前目录
scp user@10.0.0.5:/home/user/b.txt /home/local/doc/ # 将远程b.txt下载到本地doc目录传输目录(必须用 -r 选项)scp 默认无法传输目录,需使用 -r(递归)选项,传输目录及其所有子目录、文件。
本地目录传到远程
scp -r ./project root@192.168.1.100:/opt/ # 将本地project目录上传到远程/opt目录
远程目录传到本地
scp -r root@192.168.1.100:/home/user/data ./backup/ # 将远程data目录下载到本地backup目录
远程主机传到另一远程主机(需本地主机能访问两台远程)
scp user1@10.0.0.5:/home/file.txt user2@10.0.0.6:/tmp/ # 将10.0.0.5的文件传到10.0.0.6的/tmp目录
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
| -r | 递归传输:传输目录及其所有子目录和文件(必须用于传输目录) | 若目录包含大量文件,会占用大量带宽和时间;配合覆盖操作风险高 |
| -P 端口号 | 指定远程 SSH 端口:远程 SSH 非默认 22 端口时,需用此选项指定 | 注意是大写 P,小写 p 是保留文件属性,写错会导致命令执行失败 |
| -p | 保留文件属性:传输时保留文件的原修改时间、访问时间、权限等属性 | 适合备份场景,避免传输后文件属性变更 |
| -q | 静默模式:传输时不显示进度条、传输速度等信息 | 适合脚本中批量传输,减少冗余输出 |
| -v | 详细模式:显示传输的完整调试信息,包括 SSH 连接、认证、传输细节 | 适合排查传输失败、连接异常的问题 |
| -C | 压缩传输:传输过程中对数据进行压缩,减少带宽占用 | 适合传输大文件、带宽有限的场景,但会增加本地和远程主机的 CPU 占用 |
| -l 限速值 | 限制传输速度:单位为 Kbit/s,限制传输的最大带宽 | 避免传输占用全部带宽,影响其他业务,适合生产环境大文件传输 |
常用选项组合:
# 1. 指定非默认 SSH 端口,传输目录,保留文件属性
scp -rP 2222 -p ./project root@192.168.1.100:/opt/
# 2. 压缩传输大文件,限制传输速度为 10000 Kbit/s(约 10MB/s),显示详细信息
scp -Cv -l 10000 /home/user/large_file.iso root@192.168.1.100:/tmp/
# 3. 静默批量传输日志文件,不显示进度
scp -q /home/user/logs/*.log root@192.168.1.100:/home/log_archive/
# 4. 下载远程文件到本地,保留属性,显示传输进度(默认显示进度,无需额外选项)
scp -p root@192.168.1.100:/var/log/nginx/error.log ./
严禁执行的操作:
# 严禁无校验的覆盖远程系统核心目录/文件
scp -r ./malicious/* root@192.168.1.100:/etc/ # 覆盖远程系统配置目录,导致远程服务崩溃、无法登录
scp test root@192.168.1.100:/bin/ls # 覆盖远程系统核心命令,导致远程主机命令异常
# 严禁在生产环境无限制传输超大文件,不做限速,导致带宽被占满,业务中断
注意事项:
- SSH 权限要求:传输需远程主机开启 SSH 服务,且用户对远程目标路径有写入权限(上传)、对远程源文件有读取权限(下载),权限不足可通过密钥认证或 sudo 配合(需配置远程 sudo 免密)。
- 端口选项大小写:指定 SSH 端口必须用大写 -P,小写 -p 是保留文件属性,极易写错,操作前务必确认选项。
- 路径规范:远程路径若包含空格、特殊字符,需用双引号包裹,避免被 Shell 拆分;建议使用绝对路径,避免相对路径导致文件传输位置错误。
- 大文件传输建议:传输 GB 级超大文件时,建议先压缩(tar/zip)再传输,配合 -C 压缩选项和 -l 限速选项,避免占用全部带宽;也可使用 rsync 替代,支持断点续传,传输更稳定。
- 密钥认证优化:频繁传输建议配置 SSH 密钥认证,避免每次输入密码,提升传输效率和安全性。
8. mv 指令
语法:mv [选项] 源文件 / 目录 目标文件 / 目录
功能:核心作用是移动或重命名指定的文件或目录,默认情况下:
- 可直接移动 / 重命名文件、目录,无需额外递归选项;
- 同一分区内移动为 "重命名",文件数据不发生物理移动,速度极快;跨分区移动为 "复制 + 删除",完成后源文件会被删除;
- 移动后源文件 / 目录会被移除到目标路径,默认同名文件会提示是否覆盖。
基本用法:
重命名文件 / 目录语法:mv [选项] 原名称 新名称在同一路径下,对文件或目录执行重命名操作,是 Linux 重命名的核心用法。
mv note.txt note_new.txt # 将当前目录的note.txt重命名为note_new.txt
mv old_dir new_dir # 将当前目录的old_dir目录重命名为new_dir移动文件 / 目录语法:mv [选项] 源文件 / 目录 目标路径将指定的文件 / 目录移动到目标路径,支持同时移动多个文件 / 目录(空格分隔),目标路径需已存在。
mv note.txt /home/user/doc/ # 将当前目录的note.txt移动到doc目录
mv a.txt b.txt /tmp/ # 同时移动当前目录的a.txt和b.txt到/tmp目录
mv docs dir1 /home/backup/ # 同时移动docs和dir1两个目录到backup目录
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
| -f | 强制移动:忽略不存在的文件,强制覆盖目标同名文件 / 目录,无提示确认 | 减少交互,但可能误覆盖重要文件,无二次确认,需谨慎使用 |
| -i | 交互模式:覆盖前逐一提示确认(输入 y 确认覆盖,n 取消) | 增加安全性,适合移动重要文件、避免误覆盖时使用 |
| -v | 详细模式:显示移动过程(每个被移动的文件 / 目录都会被列出) | 便于确认移动范围,适合批量操作时检查、调试 |
| -n | 不覆盖:移动时跳过已存在的同名文件 / 目录,不执行覆盖 | 安全选项,避免误覆盖已有文件,增量移动时使用 |
| -u | 更新移动:仅当源文件比目标文件新,或目标文件不存在时才执行移动覆盖 | 适合增量更新文件,避免覆盖更新的目标文件 |
| -b | 备份覆盖:覆盖目标文件前,先对目标同名文件创建备份(备份文件末尾加~) | 兼顾效率与安全,覆盖后可通过备份文件恢复原内容 |
常用选项组合:
mv -i note.txt /tmp/ # 移动note.txt到/tmp目录,覆盖前提示确认(安全操作)
mv -f *.log /home/log_archive/ # 强制移动所有.log文件到归档目录,无提示覆盖同名文件
mv -v docs/ /opt/ # 移动docs目录到/opt目录,同时显示移动过程
mv -b *.conf /etc/ # 移动配置文件到/etc目录,覆盖前自动备份原文件
mv -n *.jpg /home/picture/ # 移动jpg图片到图片目录,已存在的文件不覆盖
严禁执行的操作:
# 严禁无校验的强制移动系统核心目录/文件
mv -f /tmp/test/* /bin/ # 强制移动文件到系统二进制目录,会覆盖系统命令,导致系统无法正常执行指令
mv /etc /home/ # 移动系统核心配置目录,会导致所有服务、系统配置失效,系统崩溃
注意事项:
- 移动的不可逆性:mv 跨分区移动完成后,源文件会被直接删除,不会进入回收站,误操作后难以恢复,重要文件建议先复制再删除源文件。
- 目录移动特性:mv 移动目录无需 - r 选项,直接即可移动整个目录及其所有内容,这是和 cp、rm 的核心区别。
- 权限问题:移动文件 / 目录时,需对源文件 / 目录的父目录、目标目录有写入权限,权限不够可用 sudo 提升权限,但需极度谨慎。
- 跨分区移动注意:跨磁盘分区移动大文件 / 大量文件时,会先复制再删除源文件,耗时较长,建议加 - v 选项查看进度,避免中途中断导致文件损坏。
- 重命名限制:同一路径下,不能将文件 / 目录重命名为已存在的同名文件,除非加 - f/-i 等覆盖选项,否则会报错。
9. echo 指令
语法:echo [选项] [输出内容]
功能:核心作用是在终端输出指定的字符串、变量值或表达式结果,默认情况下:
- 输出内容后会自动换行;
- 支持解析转义字符、输出 Shell 变量值,是 Shell 脚本中最常用的内容输出、日志打印命令;
- 可配合重定向,将输出内容写入到文件中。
基本用法:
输出普通字符串语法:echo [选项] 字符串直接在终端输出指定的字符串,带空格的字符串建议用双引号包裹。
echo "Hello Linux" # 在终端输出 Hello Linux
echo 123456 # 直接输出数字 123456输出变量值语法:echo $ 变量名输出 Shell 中已定义的变量、系统环境变量的值,是脚本中查看变量的核心用法。
name="test"
echo name # 输出变量name的值 test echo PATH # 输出系统环境变量PATH的内容
echo $USER # 输出当前登录的用户名配合重定向写入文件
echo "test content" > note.txt # 将字符串写入note.txt,覆盖文件原有内容
echo "new line" >> note.txt # 将字符串追加到note.txt末尾,不覆盖原有内容
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 |
|---|---|---|
| -n | 取消自动换行:输出内容后,不自动换行,光标停留在输出内容末尾 | 适合脚本中连续输出、进度条打印等场景,注意后续输出会拼接在同一行 |
| -e | 启用转义字符解析:支持解析反斜杠转义字符(如 \n、\t、\033 等) | 必须加此选项,转义字符才会生效,否则会直接输出转义字符本身 |
| -E | 禁用转义字符解析:默认行为,不解析反斜杠转义字符,直接原样输出 | 避免输出内容中的反斜杠被意外解析,适合输出包含特殊字符的内容 |
常用转义字符(需配合 - e 选项):
| 转义字符 | 功能描述 |
|---|---|
| \n | 换行符,输出时在此处换行 |
| \t | 水平制表符(Tab 键),输出时插入空格缩进 |
| \r | 回车符,光标移动到当前行的行首 |
| \\ | 输出反斜杠本身 |
| \033[ | 终端颜色控制符,用于输出带颜色的字体、背景 |
常用选项组合:
echo -e "第一行\n第二行\t带缩进" # 输出换行和制表符,实现分行和缩进
echo -n "正在处理..." # 输出内容后不换行,后续内容可拼接在同一行
echo -e "\033[31m红色字体\033[0m" # 输出红色的字体,终端高亮提示
echo "当前登录用户:$USER,当前路径:$PWD" # 输出变量组合内容,脚本日志常用
echo "export PATH=$PATH:/opt/bin" >> ~/.bashrc # 追加环境变量配置到系统配置文件
注意事项:
- 引号使用规范:输出带空格、特殊字符的内容时,建议用双引号包裹,避免内容被 Shell 拆分;单引号会原样输出内容,不解析变量和转义字符。
- 转义字符生效条件:所有反斜杠转义字符,必须加 - e 选项才会生效,否则会直接原样输出。
- 脚本中的使用:echo 是 Shell 脚本中日志打印、变量调试的核心命令,脚本中建议统一格式,方便日志排查。
- 特殊字符处理:输出包含!、$、* 等 Shell 特殊字符时,需用单引号包裹,或用反斜杠转义,避免被 Shell 解析为其他含义。
- 大文件写入:echo 仅适合写入短内容,大段内容建议使用 cat 配合重定向,避免 echo 命令过长导致可读性差。
10. cat 指令
语法:cat [选项] 文件名
功能:核心作用是查看、合并、创建文件内容,默认情况下:
- 直接读取并输出文件的全部内容到终端,适合查看小文件;
- 支持同时读取多个文件,合并输出内容;
- 配合重定向可实现文件合并、创建新文件;
- 读取大文件时会一次性加载全部内容,终端会快速滚动,不适合查看超大文件。
基本用法:
查看文件内容语法:cat [选项] 文件名直接读取并输出文件的全部内容到终端,支持同时查看多个文件(空格分隔)。
cat note.txt # 查看当前目录下note.txt的全部内容
cat /home/user/log1.log /home/user/log2.log # 同时查看两个日志文件的内容,按顺序合并输出合并多个文件语法:cat 文件 1 文件 2 > 合并后的新文件将多个文件的内容按顺序合并,写入到新文件中。
cat a.txt b.txt c.txt > all.txt # 将a.txt、b.txt、c.txt的内容合并,写入到all.txt
cat *.log > total.log # 将当前目录所有.log文件的内容合并,写入total.log创建并写入文件语法:cat > 文件名 << EOF配合重定向和结束符,创建新文件并写入多行内容,输入 EOF 结束写入。
cat > test.txt << EOF
第一行内容
第二行内容
第三行内容
EOF创建test.txt文件,并写入三行内容,输入EOF后结束编辑
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 |
|---|---|---|
| -n | 显示行号:输出内容时,给所有行(包括空行)添加连续的行号 | 便于定位内容行号,适合查看代码、配置文件时定位问题 |
| -b | 非空行显示行号:仅给非空的内容行添加行号,空行不编号、不占用行号 | 适合查看有空行的配置文件,行号更贴合有效内容 |
| -s | 压缩空行:将连续的多个空行,压缩为单个空行输出 | 适合查看有大量冗余空行的文件,提升内容可读性 |
| -A | 显示所有隐藏字符:输出换行符、制表符等不可见的特殊字符 | 排查文件中的隐藏字符、换行符异常、制表符问题时使用 |
常用选项组合:
cat -n note.txt # 查看note.txt内容,给所有行添加行号,方便定位内容
cat -b /etc/ssh/sshd_config # 查看ssh配置文件,仅给非空行添加行号,空行不编号
cat -s test.log # 查看日志文件,压缩连续的空行,减少冗余内容
cat -A test.txt # 查看文件中的所有隐藏字符,排查特殊符号问题
cat -n *.conf > config_bak.txt # 给所有配置文件内容加行号,合并写入备份文件
严禁执行的操作:
# 严禁用cat读取超大文件(GB级),会占用大量系统内存,导致终端卡死、系统负载飙升
# 错误示例:cat 10G.log # 超大日志文件用cat读取,会导致系统资源耗尽
注意事项:
- 文件大小限制:cat 适合查看 KB 级、小 MB 级的文件,超过 10MB 的大文件建议用 more、less 命令分页查看,避免终端滚动过快无法查看内容,同时减少内存占用。
- 权限问题:查看文件时,需对目标文件有读取权限,权限不够可用 sudo 提升权限;写入文件时,需对目标目录有写入权限。
- 合并文件规范:合并文件时,> 会覆盖目标文件的原有内容,>> 会追加到目标文件末尾,操作前务必确认重定向符号,避免误覆盖文件。
- 二进制文件警告:不要用 cat 读取二进制文件(如图片、可执行程序),会导致终端输出乱码,甚至终端异常,需用专用工具查看二进制文件。
- 结束符使用:创建文件时,EOF 结束符可自定义为其他字符(如 END),但必须保证开头和结尾的结束符完全一致,且结尾的结束符必须单独占一行,前后无空格。
11. 输出重定向、输入重定向、追加重定向
核心语法:
命令 重定向符号 目标文件 / 路径功能:核心作用是改变命令的默认输入 / 输出方向,将原本输出到终端的内容写入到文件,或从文件中读取内容作为命令的输入,是 Shell 中文件操作、脚本编写的核心机制
默认情况下:
- Linux 命令默认有 3 个标准流:标准输入 (stdin,文件描述符 0,默认来自键盘)、标准输出 (stdout,文件描述符 1,默认输出到终端)、标准错误输出 (stderr,文件描述符 2,默认输出到终端);
- 输出重定向改变 stdout/stderr 的输出方向,输入重定向改变 stdin 的输入来源;
- 重定向操作会直接操作文件,操作不当会导致文件内容被覆盖、丢失。
基本用法:
1. 标准输出重定向(>,覆盖式)
语法:命令 > 目标文件将命令的标准输出结果,覆盖写入到目标文件中;若文件不存在则自动创建,若文件已存在则清空原有内容后写入。
echo "Hello Linux" > test.txt # 将echo的输出内容覆盖写入test.txt,原有内容会被清空 ls -l > file_list.txt # 将当前目录的文件列表覆盖写入file_list.txt cat note.txt > note_bak.txt # 将note.txt的内容覆盖写入note_bak.txt,实现文件复制2. 标准输出追加重定向(>>,追加式)
语法:命令 >> 目标文件将命令的标准输出结果,追加写入到目标文件的末尾;若文件不存在则自动创建,若文件已存在则保留原有内容,在末尾新增内容,不会覆盖。
echo "新的一行内容" >> test.txt # 将内容追加到test.txt的末尾,不覆盖原有内容 date >> run_log.txt # 将当前时间追加到run_log.txt,适合记录脚本执行日志 cat *.log >> total_log.txt # 将所有.log文件的内容追加到total_log.txt末尾3. 标准错误输出重定向
语法:命令 2> 错误日志文件将命令执行时的错误输出,覆盖写入到目标文件,正常输出仍打印到终端;2 是标准错误输出的文件描述符,必须紧跟 >,无空格。
ls /root/test 2> error.log # 若命令执行报错,错误信息会覆盖写入error.log,正常结果输出到终端 cat not_exist.txt 2> error.log # 读取不存在的文件,错误信息写入error.log
错误追加重定向:命令 2>> 错误日志文件,将错误信息追加到文件末尾,不覆盖原有内容。
sh test.sh 2>> script_error.log # 脚本执行的错误信息,追加写入到script_error.log
4. 标准输出 + 错误输出合并重定向
语法:命令 > 目标文件 2>&1将命令的正常输出和错误输出,合并覆盖写入到同一个目标文件中,是脚本日志记录的最常用用法。
sh run.sh > run.log 2>&1 # 脚本的所有正常输出和错误输出,都覆盖写入run.log ls -l /root /test > all.log 2>&1 # 命令的所有输出和报错,都写入all.log
合并追加重定向:命令 >> 目标文件 2>&1,将所有输出追加到文件末尾,不覆盖。
sh cron_task.sh >> task.log 2>&1 # 定时任务的所有日志,追加写入task.log,适合定时任务记录
5. 标准输入重定向(<)
语法:命令 < 源文件将文件的内容作为命令的标准输入,替代默认的键盘输入,命令从文件中读取内容执行。
cat < test.txt # 从test.txt中读取内容,作为cat的输入,输出文件内容 wc -l < test.txt # 从test.txt中读取内容,统计文件的行数 mysql -uroot -p123456 < backup.sql # 从backup.sql中读取SQL语句,导入到MySQL数据库
可跟特性说明:
| 重定向符号 | 功能描述 | 风险提示 |
|---|---|---|
| > | 标准输出覆盖重定向 | 会清空目标文件原有内容,操作前务必确认文件,重要文件严禁使用,避免内容丢失 |
| >> | 标准输出追加重定向 | 不会覆盖原有内容,仅在末尾新增,是日志记录的安全选项,推荐优先使用 |
| 2> | 标准错误输出覆盖重定向 | 仅捕获错误信息,正常输出仍打印到终端,适合单独记录报错日志 |
| 2>> | 标准错误输出追加重定向 | 追加记录错误信息,不会覆盖历史报错日志,适合脚本长期运行记录错误 |
| > 文件 2>&1 | 输出 + 错误合并覆盖重定向 | 所有输出都写入同一个文件,覆盖原有内容,脚本单次执行日志常用 |
| >> 文件 2>&1 | 输出 + 错误合并追加重定向 | 所有输出都追加到同一个文件,保留历史日志,定时任务、长期运行脚本首选 |
| < | 标准输入重定向 | 从文件读取输入,避免手动输入,适合批量执行命令、导入数据场景 |
| /dev/null | 空设备文件,所有写入的内容都会被丢弃,不占用磁盘空间 | 用于屏蔽命令的输出 / 报错,不想在终端显示内容,也不想写入文件时使用 |
常用组合场景:
# 1. 屏蔽命令的所有输出和报错,不显示任何内容
ls -l > /dev/null 2>&1
# 2. 脚本日志规范写法,执行命令同时记录日志到文件,终端也显示
sh run.sh 2>&1 | tee -a run.log
# 3. 批量创建文件并写入多行内容
cat > init.sh << EOF
#!/bin/bash
echo "脚本初始化开始"
date
echo "初始化完成"
EOF
# 给脚本添加执行权限
chmod +x init.sh
# 4. 分别记录正常日志和错误日志
sh task.sh > normal.log 2> error.log
严禁执行的操作:
# 严禁无校验的覆盖重定向系统核心文件
echo "test" > /etc/passwd # 覆盖系统用户配置文件,会导致所有用户无法登录,系统崩溃
cat test.txt > /etc/fstab # 覆盖系统磁盘挂载配置文件,会导致系统重启后无法挂载磁盘,无法启动
# 严禁错误使用重定向符号,把>>写成>,导致重要日志文件被清空
# 错误示例:echo "test" > important.log # 原本想追加,写成覆盖,导致历史日志全部丢失
注意事项:
- 覆盖与追加的核心区别:> 是覆盖,会清空文件原有内容,风险极高;>> 是追加,仅在末尾新增内容,安全可控,日志记录优先使用 >>。
- 文件描述符规范:2>&1 必须写在重定向目标文件的后面,顺序错误会导致无法合并输出;2 和 > 之间不能有空格,&1 必须连写,不能有空格。
- 空设备文件 /dev/null:所有写入 /dev/null 的内容都会被永久丢弃,无法恢复,适合屏蔽不需要的输出,不要把重要内容写入 /dev/null。
- 权限问题:重定向写入文件时,需对目标目录有写入权限,即使命令加了 sudo,重定向也不会继承 sudo 权限,需用 sudo sh -c "命令 > 文件" 或 tee 命令实现 sudo 写入。
- 特殊文件警告:不要对系统核心配置文件、业务重要数据文件使用 > 覆盖重定向,必须操作前先备份文件,避免误操作导致数据丢失、系统崩溃。
12. more 指令
语法:more [选项] 文件名
功能:核心作用是分页查看文件内容,解决 cat 命令查看大文件时终端快速滚动的问题,默认情况下:
- 按页加载文件内容,一页显示满后暂停,等待用户操作后继续加载;
- 支持向下翻页、查找内容、显示行号,适合查看中等大小的文本文件;
- 仅支持向下翻页,不支持向上回翻,这是和 less 命令的核心区别。
基本用法:
直接分页查看指定文件的内容,支持同时查看多个文件(空格分隔)。
more test.log # 分页查看test.log文件的内容
more -n 10 test.log # 分页查看test.log,每页显示10行内容
more /var/log/nginx/access.log # 分页查看nginx访问日志
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 |
|---|---|---|
| -num | 指定每页显示的行数,num 为数字,如 - 10 代表每页 10 行 | 适配不同终端大小,自定义每页显示内容,提升查看体验 |
| -n | 显示行号:输出内容时,给所有行添加连续的行号 | 便于定位内容行号,查看配置文件、代码时快速定位问题 |
| -s | 压缩空行:将连续的多个空行,压缩为单个空行显示 | 减少冗余空行,提升内容可读性,适合查看有大量空行的日志 |
| +num | 从文件的第 num 行开始显示,num 为数字 | 跳过文件开头的内容,直接从指定行开始查看,适合大文件定位 |
| +/ 关键词 | 打开文件后,直接定位到第一个匹配关键词的行,并显示该行前后的内容 | 快速定位到文件中的目标内容,无需手动翻页查找 |
常用交互操作(查看文件时使用):
| 操作按键 | 功能描述 |
|---|---|
| 空格键(Space) | 向下翻一页,加载下一页的内容 |
| 回车键(Enter) | 向下滚动一行,逐行查看内容 |
| / 关键词 | 向下查找指定的关键词,匹配到的内容会高亮显示 |
| n | 跳转到下一个匹配的关键词位置 |
| :f | 显示当前文件的文件名和当前显示的行号 |
| q | 退出 more 查看模式,回到终端命令行 |
| ! 命令 | 临时执行 Shell 命令,执行完成后回到 more 查看模式 |
常用选项组合:
more -n 20 /etc/ssh/sshd_config # 分页查看ssh配置文件,每页显示20行,同时显示行号
more +/error test.log # 打开test.log文件,直接定位到第一个包含error的行
more +100 test.log # 从test.log的第100行开始查看内容
more -s *.log # 分页查看所有.log文件,压缩连续的空行
注意事项:
- 翻页限制:more 仅支持向下翻页,不支持向上回翻,若需要回看之前的内容,只能退出后重新打开,适合单向查看的场景,需要灵活翻页建议使用 less 命令。
- 文件大小适配:more 适合查看 MB 级的文件,超大文件(GB 级)建议用 tail、head 配合查看,或用 less 命令,避免加载过慢。
- 权限问题:查看文件时,需对目标文件有读取权限,权限不够可用 sudo 提升权限。
- 二进制文件警告:不要用 more 查看二进制文件(图片、可执行程序),会导致终端输出乱码,甚至异常。
- 多文件查看:同时查看多个文件时,查看完一个文件后会自动进入下一个文件,:n 切换到下一个文件,:p 切换到上一个文件。
13. less 指令
语法:less [选项] 文件名
功能:核心作用是分页查看文件内容,是 more 命令的增强版,解决了 more 无法向上翻页的问题,默认情况下:
- 支持向上、向下双向翻页,逐行滚动,灵活度极高;
- 加载文件时无需一次性读取全部内容,打开超大文件速度极快,不会占用大量内存;
- 支持关键词查找、高亮、行号显示、跳转指定行,是 Linux 中查看文件的首选命令,有 "less is more" 的称号。
基本用法:
直接分页查看指定文件的内容,支持同时查看多个文件(空格分隔)。
less test.log # 分页查看test.log文件的内容
less /var/log/nginx/access.log # 分页查看nginx访问日志
less -N /etc/ssh/sshd_config # 带行号查看ssh配置文件
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 |
|---|---|---|
| -N | 显示行号:输出内容时,给所有行添加连续的行号 | 最常用选项,便于定位内容行号,查看配置文件、代码、日志必用 |
| -s | 压缩空行:将连续的多个空行,压缩为单个空行显示 | 减少冗余空行,提升内容可读性,适合查看有大量空行的日志 |
| -i | 忽略大小写:查找关键词时,忽略大小写差异 | 适合日志查找,避免因大小写问题遗漏匹配内容 |
| -m | 显示进度百分比:在底部显示当前查看的内容占文件总内容的百分比 | 便于了解当前查看位置,掌握文件整体进度 |
| -M | 显示详细进度:在底部显示文件名、当前行号、总行数、进度百分比 | 信息更全面,精准定位当前查看位置 |
| +/ 关键词 | 打开文件后,直接定位到第一个匹配关键词的行,并高亮显示 | 快速定位到目标内容,无需手动翻页查找 |
| +G | 打开文件后,直接跳转到文件的末尾 | 查看日志文件时,直接看最新的日志内容,高频常用 |
常用交互操作(查看文件时使用):
表格
| 操作按键 | 功能描述 |
|---|---|
| 空格键(Space) | 向下翻一页 |
| PageDown | 向下翻一页 |
| PageUp | 向上翻一页 |
| 回车键(Enter) | 向下滚动一行 |
| 方向键↓ | 向下滚动一行 |
| 方向键↑ | 向上滚动一行 |
| d | 向下翻半页 |
| u | 向上翻半页 |
| g | 跳转到文件的开头(第一行) |
| G | 跳转到文件的末尾(最后一行) |
| 数字 + g | 跳转到指定的行号,如 100g 跳转到第 100 行 |
| / 关键词 | 向下查找指定的关键词,匹配内容高亮显示 |
| ? 关键词 | 向上查找指定的关键词,从当前位置往文件开头查找 |
| n | 跳转到下一个匹配的关键词位置 |
| N | 跳转到上一个匹配的关键词位置 |
| :f | 显示当前文件的文件名、行号、总行数 |
| :n | 切换到下一个查看的文件(同时打开多个文件时) |
| :p | 切换到上一个查看的文件(同时打开多个文件时) |
| q | 退出 less 查看模式,回到终端命令行 |
| F | 实时滚动刷新文件内容,等同于 tail -f,按 Ctrl+C 停止 |
| v | 调用 vi/vim 编辑器,编辑当前查看的文件 |
常用选项组合:
less -N /etc/ssh/sshd_config # 带行号查看ssh配置文件,精准定位配置项
less -m /var/log/messages # 查看系统日志,显示查看进度百分比
less +G test.log # 打开日志文件后,直接跳转到文件末尾,查看最新日志
less -i +/error test.log # 打开test.log,忽略大小写查找error关键词,直接定位到匹配行
less -NM *.conf # 查看所有配置文件,带行号、显示详细进度信息
注意事项:
- 大文件优势:less 打开文件时不会一次性加载全部内容,即使是 GB 级的超大日志文件,也能瞬间打开,不会占用大量系统内存,是查看超大文件的首选命令,远超 cat、more。
- 实时刷新功能:查看正在写入的日志文件时,按 F 键即可实时刷新显示新增的内容,和 tail -f 效果一致,按 Ctrl+C 即可停止刷新,回到正常查看模式,非常灵活。
- 权限问题:查看文件时,需对目标文件有读取权限,权限不够可用 sudo 提升权限;编辑文件时,需对文件有写入权限。
- 查找优化:查找关键词时,默认区分大小写,加 - i 选项可忽略大小写;匹配到的内容会高亮显示,n/N 快速切换匹配位置,日志排查效率极高。
- 跨平台兼容性:less 是绝大多数 Linux 发行版默认预装的命令,比 more 的兼容性更广,功能更强大,日常查看文件优先使用 less,替代 cat 和 more。
14. head 指令
语法:head [选项] 文件名
功能:核心作用是查看文件开头的内容,默认情况下:
- 不带选项时,默认输出文件的前 10 行内容到终端;
- 可通过选项自定义查看的行数、字节数,支持同时查看多个文件;
- 仅读取文件开头的内容,无需加载整个文件,打开速度极快,适合快速查看文件的头部信息、配置说明、日志开头。
基本用法:
查看文件前 N 行语法:head -n 行数 文件名输出文件开头指定行数的内容,是最核心的用法。
head test.txt # 不带选项,默认输出test.txt的前10行内容
head -n 20 test.log # 输出test.log的前20行内容
head -5 test.txt # 简写格式,直接-数字,输出test.txt的前5行内容查看文件前 N 个字节语法:head -c 字节数 文件名输出文件开头指定字节数的内容,适合查看二进制文件的头部信息、固定长度的内容。
head -c 100 test.txt # 输出test.txt前100个字节的内容
head -c 1k test.log # 输出test.log前1KB的内容,支持k(KB)、m(MB)单位同时查看多个文件
head -n 5 a.txt b.txt c.txt # 同时查看a.txt、b.txt、c.txt三个文件的前5行内容,自动标注文件名
head *.conf # 查看当前目录所有.conf文件的前10行内容,快速浏览所有配置文件
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 |
|---|---|---|
| -n 行数 | 指定输出文件开头的行数,支持简写 - 数字 | 最核心常用选项,自定义查看的行数,精准控制输出内容 |
| -c 字节数 | 指定输出文件开头的字节数,支持 k、m、g 单位 | 适合查看固定长度的头部信息、二进制文件头,避免查看整个文件 |
| -q | 静默模式:同时查看多个文件时,不输出文件名标题,仅输出内容 | 适合合并多个文件的头部内容,写入到新文件时使用 |
| -v | 详细模式:始终显示文件名标题,即使只查看一个文件 | 明确标注当前输出的文件,避免多个文件查看时混淆 |
常用选项组合:
head -n 1 /etc/passwd # 查看系统用户配置文件的第一行,快速了解文件格式
head -n 30 /var/log/nginx/access.log # 查看nginx访问日志的前30行,了解日志格式
head -q -n 5 *.log > log_head.txt # 提取所有.log文件的前5行,合并写入log_head.txt,不显示文件名
head -c 200 /usr/bin/ls # 查看ls命令二进制文件的前200个字节,查看文件头信息
head -v -n 10 test.conf # 查看test.conf的前10行,强制显示文件名标题
注意事项:
- 行数与字节数限制:-n 和 - c 选项不能同时使用,同时指定时,后指定的选项会生效,前一个会被覆盖。
- 大文件优势:head 仅读取文件开头的指定内容,无论文件多大,都能瞬间输出结果,不会占用系统内存,适合快速查看超大文件的头部信息。
- 权限问题:查看文件时,需对目标文件有读取权限,权限不够可用 sudo 提升权限。
- 管道组合用法:head 常和其他命令配合,通过管道获取输出的前几行,例如
ls -l | head -n 20查看当前目录前 20 个文件,ps aux | head -n 10查看前 10 个进程。- 空文件处理:查看空文件时,head 不会输出任何内容,也不会报错,属于正常行为。
15. tail 指令
语法:tail [选项] 文件名
功能:核心作用是查看文件末尾的内容,默认情况下:
- 不带选项时,默认输出文件的最后 10 行内容到终端;
- 可通过选项自定义查看的行数、字节数,支持实时刷新文件新增内容,是 Linux 查看日志的核心命令;
- 仅读取文件末尾的内容,无需加载整个文件,打开速度极快,适合查看日志的最新内容、文件尾部信息。
基本用法:
查看文件最后 N 行语法:tail -n 行数 文件名输出文件末尾指定行数的内容,是最核心的用法。
tail test.txt # 不带选项,默认输出test.txt的最后10行内容
tail -n 20 test.log # 输出test.log的最后20行内容
tail -5 test.txt # 简写格式,直接-数字,输出test.txt的最后5行内容实时刷新查看文件新增内容(最常用)语法:tail -f 文件名持续监听文件的新增内容,文件有新内容写入时,会实时输出到终端,是查看正在运行的服务日志的核心用法,按 Ctrl+C 停止监听。
tail -f /var/log/nginx/access.log # 实时刷新查看nginx访问日志的新增内容
tail -f test.log # 实时监听test.log文件,有新内容写入时立即显示从文件指定行开始输出到末尾语法:tail -n + 行数 文件名从文件的第 N 行开始,一直输出到文件的末尾,适合跳过文件开头的内容,查看剩余全部内容。
tail -n +100 test.log # 从test.log的第100行开始,输出到文件末尾
查看文件最后 N 个字节语法:tail -c 字节数 文件名输出文件末尾指定字节数的内容。
tail -c 100 test.txt # 输出test.txt最后100个字节的内容
tail -c 1k test.log # 输出test.log最后1KB的内容,支持k(KB)、m(MB)单位
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
| -n 行数 | 指定输出文件末尾的行数,支持简写 - 数字;+ 数字代表从第 N 行输出到末尾 | 最核心常用选项,自定义查看的行数,精准控制输出内容 |
| -f | 持续监听:实时刷新输出文件新增的内容,按 Ctrl+C 停止监听 | 日志排查、服务运行监控的必用选项,高频使用 |
| -F | 增强监听:等同于 --follow=name --retry,即使文件被删除、重建、轮转,也会自动重新监听文件 | 适合查看按天轮转的日志文件(如系统日志、服务日志),避免日志轮转后停止监听 |
| -c 字节数 | 指定输出文件末尾的字节数,支持 k、m、g 单位 | 适合查看文件末尾固定长度的内容 |
| -q | 静默模式:同时查看多个文件时,不输出文件名标题,仅输出内容 | 适合合并多个文件的尾部内容,写入到新文件时使用 |
| -v | 详细模式:始终显示文件名标题,即使只查看一个文件 | 明确标注当前输出的文件,避免多个文件查看时混淆 |
| --pid = 进程号 | 配合 - f 使用,当指定的进程结束后,自动退出 tail 监听 | 适合脚本中监听服务日志,服务进程停止后自动退出 tail,无需手动终止 |
常用选项组合:
tail -f /var/log/messages # 实时刷新查看系统日志的新增内容,排查系统问题
tail -n 50 /var/log/nginx/error.log # 查看nginx错误日志的最后50行,排查服务报错
tail -F /var/log/nginx/access.log # 增强监听nginx访问日志,日志轮转后仍能持续监听
tail -n +50 test.txt > new_test.txt # 从test.txt的第50行开始,输出所有内容写入new_test.txt
tail -f test.log --pid=12345 # 监听test.log,当进程号12345结束后,自动退出tail
tail -v -n 20 *.log # 查看所有.log文件的最后20行,强制显示文件名标题
严禁执行的操作:
# 严禁在生产服务器无限制监听海量日志文件,同时tail -f几十个日志文件,会占用大量系统资源,导致负载飙升
# 严禁用tail -f查看二进制文件、正在高速写入的超大文件,会导致终端持续刷屏,无法正常操作
注意事项:
- 实时监听的区别:-f 是监听文件的文件描述符,文件被删除、重建后会停止监听;-F 是监听文件名,文件重建后会自动重新监听,日志轮转场景必须用 - F,避免日志更新后看不到内容。
- 大文件优势:tail 仅读取文件末尾的指定内容,无论文件多大,都能瞬间输出结果,不会占用系统内存,是查看 GB 级超大日志文件的首选命令。
- 权限问题:查看文件时,需对目标文件有读取权限,权限不够可用 sudo 提升权限;实时监听文件时,需文件有读取权限,且文件所在目录有执行权限。
- 管道组合用法:tail 常和 grep 配合,过滤日志中的关键词,例如
tail -f test.log | grep "error"实时监听日志,只输出包含 error 的行,日志排查效率极高。- 停止监听:tail -f/-F 实时监听时,必须按 Ctrl+C 才能停止监听,回到终端命令行;脚本中使用时,需注意进程退出机制,避免 tail 进程残留。
16. man 指令
基本概念:
man是 Linux/Unix 系统中用于 查看命令 / 工具 / 配置文件详细手册 的命令,全称 "manual"(手册),是获取系统帮助的最核心工具之一。通过man可以查询几乎所有系统自带命令的用法、选项、参数及注意事项,是 Linux 学习者和管理员的 "随身手册"。
语法:man [选项] [目标名称]目标名称可以是:
- 系统命令(如 ls、cd、man 本身);
- 系统调用(如 open、read 等内核函数);
- 配置文件(如 passwd、nginx.conf);
- 设备文件(如 /dev/sda)等。
功能:man 会调用系统内置的手册文档(存放在 /usr/share/man 等目录),以分页形式展示指定内容的详细说明,包括命令的语法、选项、示例、相关文件等,帮助用户理解和正确使用系统工具。
常用选项:
1. 按 "章节" 查询(解决重名问题)
系统手册分为多个章节(共 8 章),部分名称可能重复(如
passwd既是命令也是配置文件),需用章节号指定查询对象,以下是常用的章节:
章节号 内容类型 示例 1 用户命令(最常用,如 ls)man 1 passwd→ 查看 passwd 命令手册2 系统调用(内核函数,如 open)man 2 open→ 查看 open 系统调用3 库函数(C 语言等库函数) man 3 printf→ 查看 printf 函数5 配置文件格式(如 /etc/passwd)man 5 passwd→ 查看 passwd 文件格式8 管理员命令(如 ifconfig)man 8 ifconfig→ 查看网络配置命令
2. 搜索相关手册(
-k和-f)
- man -k 关键词:搜索所有手册中包含 "关键词" 的内容(相当于 apropos 命令),适合不知道具体命令名时模糊查询。
man -f 名称:显示指定名称在手册中的章节和简介(相当于whatis命令),快速判断名称对应的内容类型。
手册页的结构(如何阅读)
手册页内的操作快捷键
进入 man 分页界面后,无法用鼠标操作,需通过键盘快捷键导航
快捷键 功能描述 空格键 向下翻一页(最常用)。 b 向上翻一页。 Enter 键向下翻一行。 k向上翻一行。 /关键词从当前位置向下搜索 "关键词"(如 / -l搜索-l选项的说明)。n跳转到下一个搜索结果。 N跳转到上一个搜索结果。 q退出 man界面(回到终端,必须记住!)。h查看 man自身的帮助(列出所有快捷键)。
17. find 指令
语法:find [查找路径] [选项 / 匹配条件] [执行动作]
功能:核心作用是在指定目录路径下,递归查找符合条件的文件或目录,默认情况下:
- 不指定查找路径时,默认在当前工作目录下递归查找;
- 支持按文件名、文件类型、大小、修改时间、权限、所有者等多维度条件精准匹配;
- 查找到目标后,可配合执行动作(如删除、复制、移动、执行脚本等),实现批量文件处理;
- 支持自定义递归查找的目录深度,控制遍历范围。
基本用法:
按文件名查找(最常用)语法:find 查找路径 -name "文件名匹配模式"按文件名匹配查找,支持通配符 *、?,通配符需用双引号包裹,避免被 Shell 提前解析。
find . -name "test.txt" # 当前目录及子目录查找名为test.txt的文件
find /home -name ".log" # /home目录下查找所有.log后缀的文件
find /etc -iname ".conf" # /etc目录下忽略大小写,查找所有.conf后缀的文件按文件类型查找语法:find 查找路径 -type 文件类型精准过滤文件类型,避免查找结果混入无关类型文件。
find . -type d # 当前目录及子目录查找所有目录
find /var/log -type f -name "*.log" # /var/log下查找所有.log后缀的普通文件常用文件类型:f(普通文件)、d(目录)、l(软链接)、b(块设备)、c(字符设备)。
按文件大小查找语法:find 查找路径 -size [+/-] 大小单位+ 代表大于,- 代表小于,无符号代表等于,支持单位:c(字节)、k(KB)、M(MB)、G(GB)。
find . -size +100M # 当前目录查找大于100MB的文件
find /tmp -size -10k # /tmp目录查找小于10KB的文件按修改时间查找语法:find 查找路径 -mtime [+/-] 天数+ 代表 n 天以前,- 代表 n 天以内,无符号代表正好第 n 天;支持 - mmin(分钟级)、-atime(访问时间)、-ctime(状态修改时间)。
find . -mtime -7 # 当前目录查找7天内修改过的文件
find /var/log -mtime +30 # /var/log下查找30天以前修改过的文件
可跟选项:
| 选项 | 功能描述 | 风险提示 |
|---|---|---|
| -name | 按文件名匹配查找,支持通配符 *、? | 通配符必须用双引号包裹,避免被 Shell 提前解析,导致查找结果异常 |
| -iname | 忽略大小写按文件名匹配查找 | 适合文件名大小写不统一的场景,避免遗漏匹配结果 |
| -type | 按文件类型匹配查找,常用 f (普通文件)、d (目录)、l (软链接) | 精准过滤文件类型,避免查找结果混入无关类型文件 |
| -size | 按文件大小匹配查找,支持 +/- 筛选大于 / 小于指定大小的文件 | 单位区分大小写,k 是 KB、M 是 MB、G 是 GB,写错单位会导致查找结果完全错误 |
| -mtime | 按文件内容修改时间匹配,单位天,支持 +/- 筛选 | +n 是 n 天以前,-n 是 n 天以内,注意符号含义,避免筛选时间范围错误 |
| -maxdepth | 限制递归查找的最大目录深度,如 - maxdepth 1 仅查找当前目录 | 避免无限制递归深层目录,提升查找效率,减少系统资源占用 |
| -user/-group | 按文件所有者 / 所属组匹配查找 | 系统目录查找需 sudo 权限,普通用户会出现权限不足提示 |
| -perm | 按文件权限匹配查找,如 - perm 644 | 适合查找权限异常的文件,需注意权限数字的准确性 |
| -exec | 对查找到的每个文件执行指定 Shell 命令,{} 代表匹配到的文件,命令必须以;结尾 | 高危选项,尤其是配合 rm 删除时,必须先确认查找结果,再执行动作,避免误删 |
| -delete | 直接删除查找到的符合条件的文件 / 目录 | 极高危选项,删除后无法恢复,必须先执行查找确认结果,再添加该选项 |
| -o/-a/-not | 逻辑或 / 逻辑与 / 逻辑非,实现多条件组合匹配 | 多条件组合时注意优先级,避免逻辑错误导致匹配结果异常 |
常用选项组合:
# 1. 安全查找:当前目录查找7天内修改过的.log文件,仅列出结果
find . -type f -name "*.log" -mtime -7
# 2. 限制深度查找:仅在/etc一级目录下查找.conf文件,不递归子目录
find /etc -maxdepth 1 -type f -name "*.conf"
# 3. 查找大文件:查找/目录下大于1GB的文件,显示文件大小和路径,排查磁盘占用
find / -type f -size +1G -exec ls -lh {} \;
# 4. 批量清理过期日志:先确认查找结果,无误后再执行删除
find /var/log -type f -name "*.log" -mtime +30
# 确认无误后执行删除:find /var/log -type f -name "*.log" -mtime +30 -delete
# 5. 多条件组合查找:查找当前目录下,非.log后缀、大于10MB、7天内修改的文件
find . -type f -not -name "*.log" -size +10M -mtime -7
严禁执行的操作:
# 严禁无提前校验的根目录批量删除,会直接导致系统崩溃、数据完全丢失
find / -name "*.log" -delete # 根目录无校验删除,会误删系统核心文件,导致系统异常
find / -type f -mtime +7 -exec rm -rf {} \; # 无校验删除根目录文件,系统直接瘫痪
# 严禁未确认查找结果就直接加-delete/-exec rm,误删后数据几乎无法恢复
注意事项:
- 路径规范:查找路径建议写绝对路径,避免当前目录切换导致查找范围错误;当前目录查找用。表示,根目录查找 / 需极度谨慎。
- 高危操作规范:所有带删除、修改的操作,必须先执行不带动作的查找命令,确认结果完全符合预期后,再添加动作执行。
- 查找效率:查找大目录、海量文件时,建议添加 - maxdepth 限制查找深度,用 - type 精准过滤文件类型,减少不必要的递归遍历。
- 权限问题:查找系统目录(/etc、/root、/var 等)时,需 root 权限,可加 sudo 提升权限,但需更谨慎。
18. which 指令
语法:which [选项] 命令名
功能:核心作用是查找指定 Shell 命令对应的可执行文件的绝对路径,默认情况下:
- 会在系统环境变量 $PATH 定义的目录中,按顺序查找命令对应的可执行文件;
- 默认只返回第一个匹配到的可执行文件路径;
- 可识别命令的别名(alias),返回别名对应的真实命令路径;
- 仅能查找可执行的二进制文件、脚本,无法查找普通文件、目录。
基本用法:
基础查找命令路径语法:which 命令名直接查找指定命令的可执行文件绝对路径,是最核心用法。
which ls # 查找ls命令的可执行文件路径,默认返回/bin/ls
which python3 # 查找python3命令的可执行文件路径
which nginx # 查找nginx服务的可执行文件路径查找命令的所有匹配路径语法:which -a 命令名查找 $PATH 中所有匹配的可执行文件路径,返回所有结果,而非仅第一个。
which -a python # 查找所有python命令的可执行文件路径,显示所有匹配结果
which -a java # 查找所有java命令的可执行文件路径
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -a | 查找所有匹配路径:返回 $PATH 目录中所有匹配的可执行文件路径 | 适合排查命令多版本共存的问题,确认当前生效的版本 |
| --skip-alias | 跳过别名解析:不处理命令的别名,直接查找原始命令的可执行路径 | 适合排查别名导致的命令执行异常,确认原始命令的真实路径 |
| -i | 忽略大小写:查找命令名时忽略大小写差异 | 仅部分 Linux 发行版支持,兼容性有限,不建议跨平台脚本使用 |
常用选项组合:
# 1. 排查命令多版本问题:查找所有匹配的java路径,确认当前生效版本
which -a java
# 2. 跳过别名,查找原始命令路径:比如ls设置了别名,查看原始ls命令的路径
which --skip-alias ls
# 3. 同时查找多个命令的路径
which ls cat grep rm
注意事项:
- 查找范围限制:which 仅在环境变量定义的目录中查找,不在PATH 中的目录,即使有可执行文件,也无法找到。
- 别名解析:默认会解析命令的别名,返回别名对应的真实命令路径,若需查看原始命令路径,需加 --skip-alias 选项。
- 脚本常用场景:Shell 脚本中常用 which 判断命令是否存在,例如
if which nginx >/dev/null 2>&1; then echo "nginx已安装"; fi。- 权限问题:which 无需 root 权限,普通用户即可正常执行,仅需对 $PATH 中的目录有读取权限。
19. alias 指令
语法:alias [别名 =' 真实命令 ']
功能:核心作用是给 Shell 命令设置别名,将长命令、复杂命令简化为短别名,提升命令行操作效率,默认情况下:
- 不带参数时,列出当前 Shell 环境中所有已设置的别名;
- 别名仅在当前 Shell 会话中生效,关闭终端后会失效,需写入配置文件永久生效;
- 别名优先级高于原始命令,会优先执行别名对应的命令;
- 支持给带选项、参数、管道的复杂命令设置别名,简化操作。
基本用法:
查看当前所有别名语法:alias直接执行,列出当前 Shell 环境中所有已定义的别名。
alias # 查看当前所有已设置的别名
设置临时别名(当前会话生效)语法:alias 别名 =' 真实命令 '给指定命令设置别名,带选项、参数的命令必须用单引号包裹。
alias ll='ls -l' # 设置ll为ls -l的别名,执行ll等同于执行ls -l
alias la='ls -alh' # 设置la为ls -alh的别名,显示所有文件,带人类易读单位
alias grep='grep --color=auto' # 设置grep别名,匹配内容自动高亮显示
alias rm='rm -i' # 设置rm别名,删除前提示确认,提升安全性取消别名语法:unalias 别名取消指定的别名,恢复原始命令的执行。
unalias ll # 取消ll别名
unalias rm # 取消rm的别名,恢复原始rm命令
unalias -a # 取消当前Shell环境中所有的别名
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -p | 以可复用的格式打印所有别名,输出内容可直接写入配置文件 | 适合备份当前别名配置,快速写入.bashrc 等配置文件 |
| 无参数 | 列出当前 Shell 中所有已定义的别名,显示别名与真实命令的对应关系 | 快速查看当前已设置的别名,排查命令执行异常 |
常用选项组合:
# 1. 高频简化别名,提升操作效率
alias ll='ls -l --color=auto'
alias la='ls -alh --color=auto'
alias ..='cd ..' # 简化上级目录切换
alias ...='cd ../..' # 简化上两级目录切换
alias df='df -h' # 简化磁盘查看命令,默认带人类易读单位
alias free='free -h' # 简化内存查看命令,默认带人类易读单位
# 2. 安全类别名,降低误操作风险
alias rm='rm -i' # 删除前提示确认
alias cp='cp -i' # 覆盖前提示确认
alias mv='mv -i' # 覆盖前提示确认
# 3. 永久生效别名:将别名写入Shell配置文件,重启终端也生效
# 1. 编辑配置文件(Bash用~/.bashrc,Zsh用~/.zshrc)
vi ~/.bashrc
# 2. 在文件末尾添加别名配置
# 3. 使配置立即生效
source ~/.bashrc
严禁执行的操作:
# 严禁给系统核心命令设置破坏性别名,会导致命令执行异常,甚至系统崩溃
alias cd='rm -rf' # 给cd设置别名,执行cd会直接删除文件,导致灾难性后果
alias ls='rm -rf /*' # 恶意别名,执行ls会直接删除根目录所有文件,系统直接瘫痪
# 严禁在系统全局配置文件(/etc/bashrc)中设置高危别名,会影响所有用户
注意事项:
- 生效范围:终端直接设置的别名仅在当前 Shell 会话生效,永久生效需写入对应用户的 Shell 配置文件,全局生效写入 /etc/bashrc。
- 别名优先级:别名的执行优先级高于系统原始命令,排查命令执行异常时,需先检查是否设置了别名。
- 引号规范:别名对应的真实命令必须用单引号包裹,避免命令中的变量、管道被 Shell 提前解析,确保别名正常生效。
- 安全提示:不要给 rm、cd、ls 等高频核心命令设置破坏性别名,生产服务器建议设置 rm、cp、mv 的 - i 别名,提升操作安全性。
20. grep 指令
语法:grep [选项] "匹配模式 / 关键词" [目标文件 / 输入流]
功能:核心作用是在指定的文件、输入流中,查找匹配指定模式(关键词、正则表达式)的行,并输出匹配的内容,默认情况下:
- 支持普通字符串匹配、基础正则表达式、扩展正则表达式匹配;
- 默认输出包含匹配关键词的整行内容;
- 支持管道输入,可接收其他命令的输出作为查找目标,是 Shell 管道操作的核心命令;
- 可自定义输出格式,显示行号、匹配次数、上下文内容、高亮匹配关键词等。
基本用法:
基础文件内容查找语法:grep "关键词" 目标文件在指定文件中查找包含关键词的行,输出整行内容,是最核心用法。
grep "error" test.log # 在test.log中查找包含error的行,输出整行内容
grep "root" /etc/passwd # 在/etc/passwd中查找包含root的行
grep "192.168.1.1" /var/log/nginx/access.log # 在nginx日志中查找指定IP的访问记录多文件批量查找语法:grep "关键词" 文件 1 文件 2 目录 /*同时在多个文件、目录下的文件中查找匹配内容,自动标注匹配的文件名。
grep "error" /var/log/*.log # 在/var/log目录下所有.log文件中查找包含error的行
grep -r "test" /home/user/ # 递归查找/home/user目录下所有文件中包含test的行管道输入查找语法:其他命令 | grep "关键词"接收其他命令的标准输出,过滤出包含关键词的行,是最常用的组合用法。
ps aux | grep "nginx" # 查看系统所有进程,过滤出nginx相关的进程
ls -l | grep ".txt" # 列出当前目录文件,过滤出.txt后缀的文件
cat /etc/passwd | grep "bash" # 查看系统用户,过滤出使用bash的用户
可跟选项:
| 选项 | 功能描述 | 风险提示 / 使用提示 | |
|---|---|---|---|
| -i | 忽略大小写:查找时忽略关键词的大小写差异 | 适合日志、文本中大小写不统一的场景,避免遗漏匹配结果,高频常用 | |
| -v | 反向匹配:输出不包含关键词的行,取反过滤 | 适合排除不需要的内容,如过滤掉注释行、空行,高频常用 | |
| -n | 显示行号:输出匹配行的同时,显示该行在文件中的行号 | 便于定位匹配内容的位置,查看代码、配置文件、日志时必用 | |
| -c | 统计匹配次数:仅输出匹配到的总行数,不输出具体内容 | 适合统计关键词出现的次数,日志统计、数据统计常用 | |
| -r | 递归查找:递归查找指定目录下所有文件中的匹配内容 | 批量查找目录下所有文件,注意不要在根目录无限制递归,避免系统资源占用过高 | |
| -w | 全词匹配:仅匹配完整的单词,不匹配单词的一部分 | 避免关键词作为其他单词的一部分被匹配,精准查找 | |
| -A N | 显示匹配行的后 N 行内容(After) | 查看匹配内容的下文,日志排查报错的上下文信息,高频常用 | |
| -B N | 显示匹配行的前 N 行内容(Before) | 查看匹配内容的上文,配合 - A 使用,查看完整上下文 | |
| -C N | 显示匹配行的前后各 N 行内容(Context) | 等同于 - A N -B N,快速查看匹配内容的完整上下文,日志排查必用 | |
| -E | 启用扩展正则表达式:支持扩展正则语法,等同于 egrep | 支持更复杂的正则匹配,如 | (或)、+、() 等,复杂匹配场景必用 |
| -F | 固定字符串匹配:将关键词作为普通固定字符串,不解析正则表达式 | 查找包含正则特殊字符的内容时,避免被解析为正则,提升查找效率 | |
| -o | 仅输出匹配内容:只输出匹配到的关键词部分,不输出整行内容 | 适合提取文本中的指定内容,配合正则提取关键信息 | |
| -l | 仅输出匹配的文件名:仅输出包含匹配内容的文件名,不输出具体匹配行 | 批量查找时,快速筛选出包含关键词的文件 | |
| --color=auto | 匹配内容高亮显示:将匹配到的关键词自动高亮显示 | 提升内容可读性,快速定位匹配关键词,建议设置为别名默认启用 |
常用选项组合:
# 1. 日志排查高频用法:查找error关键词,忽略大小写,显示行号,前后各5行上下文
grep -inC 5 "error" /var/log/nginx/error.log
# 2. 反向过滤:查看配置文件,排除注释行(#开头)和空行
grep -vE "^#|^$" /etc/ssh/sshd_config
# 3. 进程查找:过滤进程,排除grep自身进程
ps aux | grep "nginx" | grep -v grep
# 4. 统计匹配次数:统计日志中404状态码出现的次数
grep -c " 404 " /var/log/nginx/access.log
# 5. 递归查找:在/etc目录下递归查找所有.conf文件中包含Listen关键词的行,显示行号
grep -rn "Listen" /etc/ --include="*.conf"
# 6. 提取匹配内容:用正则提取日志中的所有IP地址
grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" /var/log/nginx/access.log
严禁执行的操作:
# 严禁在根目录无限制递归查找海量文件,会占用大量CPU、内存资源,导致系统负载飙升
grep -r "test" / # 直接在根目录递归查找,会遍历所有文件,导致系统资源耗尽
注意事项:
- 正则表达式:默认 grep 仅支持基础正则表达式,若需使用扩展正则(|、+、()、? 等),必须加 - E 选项,或使用 egrep 命令。
- 特殊字符处理:查找的关键词包含.、*、?、$ 等正则特殊字符时,需用反斜杠 \ 转义,或加 - F 选项将关键词作为普通字符串处理。
- 管道组合:grep 是 Shell 管道操作的核心命令,常和 ps、ls、cat、tail、find 等命令配合,实现复杂的内容过滤、数据提取。
- 大文件处理:grep 处理 GB 级超大文件时,采用流式处理,无需加载整个文件,效率远高于编辑器打开查找,是日志排查的首选。
- 权限问题:查找系统目录、受保护的文件时,需 root 权限,可加 sudo 提升权限。
21. 管道 |
语法:命令 1 | 命令 2 [| 命令 3 ...]
功能:核心作用是将前一个命令的标准输出(stdout) ,作为后一个命令的标准输入(stdin),实现多命令的串行协同处理,默认情况下:
- 仅处理前一个命令的标准输出,不处理标准错误输出(stderr);
- 命令按从左到右的顺序串行执行,前一个命令执行完成后,输出传递给后一个命令;
- 支持多级管道串联,实现复杂的文本、数据处理流水线。
基本用法:
语法:命令 A | 命令 B
将命令 A 的输出结果,直接交给命令 B 进行处理,无需生成中间临时文件。
ls -l | grep ".txt" # 列出当前目录所有文件,筛选出包含.txt后缀的条目
cat /etc/passwd | wc -l # 读取系统用户配置文件,统计文件的总行数
ps aux | grep nginx # 查看系统所有进程,筛选出nginx相关的进程信息
可跟特性说明:
| 特性 | 功能描述 | 使用提示 | |
|---|---|---|---|
| 标准输出传递 | 仅传递前序命令的 stdout,默认不传递 stderr | 若需传递错误输出,需搭配 2>&1 重定向,如 `cat file 2>&1 | grep "error"` |
| 多级串联 | 支持无限级命令串联,形成数据处理流水线 | 避免过度嵌套导致可读性下降,复杂逻辑建议拆分脚本 | |
| 管道返回值 | 默认返回最后一条命令的退出状态码 | 需获取所有命令状态可使用 PIPESTATUS 变量,适配 shell 脚本场景 |
常用组合场景:
# 1. 日志筛选与统计:统计nginx日志中状态码为404的请求数量
cat /var/log/nginx/access.log | grep "404" | wc -l
# 2. 结果排序与去重:查看系统登录用户,去重后排序
last | awk '{print $1}' | sort | uniq
# 3. 进程批量处理:筛选出java进程并强制终止(谨慎使用)
ps aux | grep java | grep -v grep | awk '{print $2}' | xargs kill -9
严禁执行的操作:
# 严禁无校验的批量删除/高危操作管道,例如:
find / -name "*.log" | rm -rf # 错误用法,管道无法直接传递文件名给rm,会导致不可预期的删除
# 此类操作需使用xargs或find的-exec参数,且必须提前校验筛选结果
注意事项:
- 数据传递特性:管道传递的是字节流,而非文件名称,部分不支持标准输入的命令(如 rm、cp 等)无法直接接收管道内容,需搭配 xargs 命令使用。
- 错误处理:默认管道不中断执行,即使前序命令执行失败,后续命令仍会执行,脚本中可使用
set -o pipefail让管道中任意命令失败时,整体返回非 0 状态码。- 性能优化:管道无需生成中间文件,处理大文件时比 "先写入文件再读取" 的方式性能更高,适合高频数据处理场景。
22. zip /unzip 指令
zip 指令(压缩)
语法:zip [选项] 压缩包名.zip 待压缩的文件 / 目录
功能:核心作用是将指定的文件或目录打包并压缩为.zip 格式的压缩包,默认情况下:
- 可直接压缩单个 / 多个文件;
- 需配合选项才能压缩目录(递归处理子目录);
- 生成的.zip 压缩包兼容 Windows、macOS、Linux 多平台,通用性极强。
基本用法:
压缩文件语法:zip [选项] 压缩包名.zip 文件 1 文件 2 ...直接压缩指定文件,支持同时压缩多个文件(空格分隔)。
zip note.zip note.txt # 将当前目录的note.txt压缩为note.zip
zip log.zip /home/user/temp/log1.log log2.log # 压缩指定路径的log1.log和当前目录的log2.log压缩目录(必须用 -r 选项)zip 默认无法递归压缩目录,需使用 -r(递归)选项,压缩目录及其所有子目录、文件。
zip -r docs.zip docs # 压缩docs目录及其内部所有文件和子目录,生成docs.zip
zip -r project.zip dir1 dir2 # 同时压缩dir1和dir2两个目录及其内容
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -r | 递归压缩:压缩目录及其所有子目录和文件(必须用于压缩目录) | 压缩目录时必须携带,否则仅会生成空的目录压缩包 |
| -q | 静默模式:压缩时不输出执行过程信息 | 适合脚本中批量压缩,减少冗余输出 |
| -m | 移动压缩:压缩完成后,删除原始的文件 / 目录 | 风险较高,确认备份后再使用,避免原始文件丢失 |
| -P 密码 | 加密压缩:为压缩包设置密码,解压时需输入对应密码 | 仅基础加密,安全性有限,不适合存储高敏感数据 |
| -9 | 最高压缩比:优先保证压缩率,压缩速度会变慢 | 适合大文件 / 长期归档场景;默认压缩级别为 - 6,平衡速度与压缩率 |
| -1 | 最快压缩:优先保证压缩速度,压缩率较低 | 适合临时打包、小文件快速处理场景 |
常用选项组合:
zip -rq project.zip src/ # 静默递归压缩src目录,不输出过程信息
zip -rP 123456 backup.zip /home/user/data/ # 递归压缩data目录,并设置解压密码为123456
zip -rm log.zip *.log # 压缩当前目录所有.log文件,压缩完成后删除原始log文件
zip -9r archive.zip big_file/ # 以最高压缩比递归压缩big_file目录
严禁执行的操作:
# 严禁无校验的-m选项系统目录操作,例如:
zip -rm system.zip /etc /home # 压缩系统核心目录后删除原始文件,会直接导致系统崩溃、数据丢失
unzip 指令(解压)
语法:unzip [选项] 压缩包名.zip
功能:核心作用是解压.zip 格式的压缩包,提取其中的文件和目录,默认情况下:
- 直接解压到当前工作目录;
- 自动还原压缩包的目录结构;
- 支持查看压缩包内容、校验压缩包完整性,无需完整解压。
基本用法:
基础解压语法:unzip 压缩包名.zip直接将指定压缩包完整解压到当前目录。
unzip note.zip # 将note.zip完整解压到当前目录
unzip /home/user/backup.zip # 解压指定路径的backup.zip到当前目录解压到指定目录(必须用 -d 选项)
unzip docs.zip -d /home/user/temp/ # 将docs.zip解压到指定的temp目录下,目录不存在会自动创建
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -d 目录路径 | 指定解压目录:将压缩包内容解压到指定目录 | 最常用选项,避免解压文件污染当前工作目录 |
| -l | 列表查看:仅列出压缩包内的文件 / 目录结构、大小,不执行解压 | 适合提前确认压缩包内容,避免解压冗余文件 |
| -t | 校验测试:测试压缩包完整性,检查是否损坏,不执行解压 | 下载压缩包后,建议先执行此命令校验文件完整性 |
| -o | 强制覆盖:解压时无需确认,直接覆盖已存在的同名文件 | 风险较高,可能覆盖已有修改的文件,无二次确认 |
| -n | 不覆盖:解压时跳过已存在的同名文件,不进行覆盖 | 安全选项,适合增量解压,避免误覆盖已有文件 |
| -q | 静默模式:解压时不输出执行过程信息 | 适合脚本中批量解压,减少冗余输出 |
| -P 密码 | 解压加密压缩包:指定解压密码,解压加密的 zip 包 | 密码需紧跟 - P 参数,注意密码明文会留在命令历史中 |
常用选项组合:
unzip -n project.zip -d /opt/app/ # 将project.zip解压到/opt/app/目录,已存在的文件不覆盖
unzip -l backup.zip # 仅查看backup.zip内的文件列表,不执行解压
unzip -t download.zip # 校验download.zip压缩包是否损坏
unzip -oP 123456 secret.zip -d ~/private/ # 输入密码解压加密压缩包到指定目录,强制覆盖同名文件
严禁执行的操作:
# 严禁无校验的-o选项系统目录解压,例如:
unzip -o malicious.zip -d / # 直接解压到根目录,恶意压缩包会覆盖系统核心文件,导致系统瘫痪
zip/unzip 通用注意事项:
- 跨平台兼容性:.zip 是跨平台通用格式,Windows 生成的 zip 包在 Linux 中可正常解压,反之亦然,注意文件名编码问题(中文文件名建议使用 UTF-8 编码)。
- 权限问题:压缩 / 解压文件时,需对目标目录有写入权限,对源文件有读取权限,权限不足可使用 sudo 提升权限。
- 大文件处理:zip 单文件最大支持 4GB(传统 zip 格式),超过 4GB 的大文件建议使用 zip64 格式,或切换为 tar 压缩格式。
- 安全提示:加密 zip 的密码保护强度有限,无法抵御暴力破解,高敏感数据建议使用更安全的加密方式;不要解压来源不明的 zip 包,避免恶意文件入侵。
23. tar 指令
语法:tar [选项] 归档包名 [待打包的文件 / 目录]
功能:核心作用是将多个文件 / 目录打包为单个 tar 归档文件,配合压缩选项可实现打包 + 压缩一体化处理,是 Linux 中最常用的归档压缩工具,默认情况下:
- 仅打包不压缩,需配合压缩选项(gzip/bzip2/xz)实现压缩;
- 支持递归打包目录及其所有子目录、文件,无需额外递归选项;
- 保留文件的权限、所有者、时间戳等属性,适合系统备份、文件归档场景。
基本用法:
打包文件 / 目录(仅打包,不压缩)语法:tar -cvf 归档包名.tar 源文件 / 目录将指定的文件 / 目录打包为 tar 归档文件,保留文件属性。
tar -cvf note.tar note.txt # 将当前目录的note.txt打包为note.tar
tar -cvf docs.tar docs/ # 打包docs目录及其所有内容,生成docs.tar
tar -cvf project.tar dir1 dir2 file1 # 同时打包dir1、dir2两个目录和file1文件打包 + 压缩一体化(最常用)tar 支持搭配多种压缩算法,通过选项直接实现打包 + 压缩,无需额外命令。
gzip压缩(.tar.gz/.tgz,兼容性最好,速度快)
tar -zcvf archive.tar.gz docs/ # 打包docs目录并以gzip压缩,生成archive.tar.gz
bzip2压缩(.tar.bz2,压缩率比gzip高,速度稍慢)
tar -jcvf archive.tar.bz2 docs/ # 打包docs目录并以bzip2压缩,生成archive.tar.bz2
xz压缩(.tar.xz,压缩率最高,适合大文件归档,速度最慢)
tar -Jcvf archive.tar.xz docs/ # 打包docs目录并以xz压缩,生成archive.tar.xz
解压 / 提取归档文件语法:tar [选项] 归档包名 [-C 目标目录]提取 tar 归档包中的内容,自动识别压缩格式,无需额外指定压缩算法。
基础解压到当前目录
tar -xvf archive.tar # 解压tar归档包到当前目录
tar -xvf archive.tar.gz # 解压gzip压缩的tar包,自动识别压缩格式
tar -xvf archive.tar.bz2 # 解压bzip2压缩的tar包
tar -xvf archive.tar.xz # 解压xz压缩的tar包解压到指定目录(必须用 -C 选项)
tar -xvf archive.tar.gz -C /home/user/temp/ # 将压缩包内容解压到指定的temp目录
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -c | 创建模式:生成新的归档包,用于打包操作 | 打包时必须携带,与 - x 互斥,不可同时使用 |
| -x | 提取模式:解压 / 提取归档包中的内容,用于解压操作 | 解压时必须携带,与 - c 互斥,不可同时使用 |
| -v | 详细模式:显示打包 / 解压的过程,列出所有处理的文件 / 目录 | 便于确认操作范围,适合手动操作;脚本中可省略,减少输出 |
| -f | 指定归档文件:后面必须紧跟归档包的文件名 | 必须放在所有选项的最后一位,后面直接接包名,是必选选项 |
| -z | gzip 压缩 / 解压:启用 gzip 算法,对应.tar.gz 格式 | 最通用的压缩选项,平衡速度与压缩率 |
| -j | bzip2 压缩 / 解压:启用 bzip2 算法,对应.tar.bz2 格式 | 压缩率优于 gzip,适合中等大小文件归档 |
| -J | xz 压缩 / 解压:启用 xz 算法,对应.tar.xz 格式 | 压缩率最高,适合大文件、长期归档场景 |
| -C 目录路径 | 指定解压目录:将归档内容解压到指定目录 | 避免解压文件污染当前目录,是解压高频选项 |
| -t | 列表查看:仅列出归档包内的文件 / 目录结构,不执行解压 | 提前确认包内容,避免解压冗余文件 |
| -p | 保留权限:解压时保留文件的原始权限、所有者属性 | 系统备份、迁移时必须携带,避免权限异常 |
| --exclude = 模式 | 排除文件:打包时排除匹配指定模式的文件 / 目录 | 适合打包时跳过临时文件、日志、缓存目录 |
常用选项组合:
# 1. 系统备份高频命令:打包/opt目录,保留文件权限,排除临时文件
tar -zcvpf opt_backup.tar.gz /opt/ --exclude=/opt/temp --exclude=*.log
# 2. 安全解压:查看压缩包内容,确认后再解压
tar -tf project.tar.gz # 仅查看包内文件列表
tar -xvf project.tar.gz -C ~/workspace/ # 解压到指定工作目录
# 3. 增量打包:仅打包指定时间内修改过的文件
tar -zcvf update.tar.gz --newer-mtime="7 days ago" /home/user/data/
# 4. 跨目录打包解压:将A目录的内容直接打包解压到B目录,无需生成中间包
tar -cf - -C /source/dir . | tar -xf - -C /target/dir
严禁执行的操作:
# 严禁无校验的解压到系统根目录,例如:
tar -xvf malicious.tar -C / # 直接解压到根目录,恶意归档包会覆盖系统核心文件,导致系统瘫痪、数据丢失
# 严禁打包时使用错误的--exclude路径,导致核心文件被排除,备份失效
注意事项:
- 选项顺序:-f 选项必须放在所有选项的最后,后面直接跟归档包名,错误的顺序(如 tar -fvcz)会导致命令执行失败。
- 压缩格式识别:现代 tar 命令解压时可自动识别 gzip/bzip2/xz 格式,无需指定 - z/-j/-J 选项,仅需 - xvf 即可完成解压。
- 权限问题:打包系统目录、解压到系统目录时,需 root 权限(sudo),否则会出现权限不足、无法保留文件所有者的问题。
- 大文件处理:tar 无单文件 4GB 的限制,支持超大文件、海量小文件的打包归档,是 Linux 系统备份、软件分发的首选格式。
- 安全提示:不要解压来源不明的 tar 包,部分恶意包会包含绝对路径文件,解压后直接覆盖系统文件,建议先使用 - t 选项查看包内结构,确认安全后再解压。
24. bc 指令
语法:bc [选项] [脚本文件]
功能:核心作用是 Linux 下的高精度计算器工具,支持整数、浮点数的算术运算、逻辑运算、函数运算,支持交互式计算和脚本批量计算,默认情况下:
- 支持交互式模式,进入 bc 环境后可逐行输入表达式计算;
- 默认整数精度,可通过 scale 参数设置小数位数,实现高精度浮点运算;
- 兼容 C 语言的大部分运算符、语法,支持自定义函数、循环、条件判断。
基本用法:
交互式计算(最常用)语法:直接输入 bc,进入交互式计算环境,输入表达式回车即可输出结果,输入 quit 退出。
bc # 进入bc交互式环境
进入后输入:
1+2*3 # 输出7
scale=2 # 设置小数精度为2位
10/3 # 输出3.33
quit # 退出bc环境非交互式单行计算通过管道传递表达式,直接输出计算结果,无需进入交互式环境,适合脚本中使用。
echo "1+2*3" | bc # 直接输出计算结果7
echo "scale=4; 10/3" | bc # 设置4位小数精度,输出3.3333执行 bc 计算脚本将多个计算表达式写入脚本文件,通过 bc 批量执行。
编写calc.bc脚本,内容如下:
scale=3
a=10
b=3
a/b
a*b
bc calc.bc # 执行脚本,依次输出3.333、30
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -l | 启用数学库:加载高级数学函数库,同时默认设置 scale=20(20 位小数精度) | 必须携带此选项才能使用 sin、cos、log、sqrt 等高级数学函数 |
| -q | 静默模式:启动时不输出 bc 的版本、版权等欢迎信息 | 最常用选项,避免冗余输出,脚本中必加 |
| -i | 强制交互式模式:即使输入来自文件 / 管道,也强制进入交互式环境 | 适合调试计算脚本 |
| -w | 警告模式:对不符合 POSIX 标准的语法给出警告提示 | 编写跨平台 bc 脚本时使用 |
核心内置功能与常用语法:
| 语法 / 函数 | 功能描述 | 示例 | |
|---|---|---|---|
| scale=N | 设置小数精度,N 为保留的小数位数,默认 0(整数运算) | scale=5; 1/2 输出 0.50000 | |
| + - * / % ^ | 算术运算符:加、减、乘、除、取余、幂运算 | 2^10 输出 1024 | |
| > < >= <= == != | 比较运算符,返回 1(真)、0(假) | 5>3 输出 1 | |
| && || ! | 逻辑运算符:与、或、非 | 1&&0 输出 0 | |
| sqrt(x) | 计算 x 的平方根(需 - l 选项) | echo "sqrt(16)" | bc -l 输出 4 |
| s(x) | 计算 x 的正弦值(x 为弧度,需 - l 选项) | echo "s(3.1415926/2)" | bc -l 输出接近 1 |
| c(x) | 计算 x 的余弦值(x 为弧度,需 - l 选项) | echo "c(0)" | bc -l 输出 1 |
| l(x) | 计算 x 的自然对数(需 - l 选项) | echo "l(2.71828)" | bc -l 输出接近 1 |
| e(x) | 计算 e 的 x 次方(需 - l 选项) | echo "e(1)" | bc -l 输出 e 的近似值 |
常用选项组合:
# 1. 静默高精度浮点计算,最常用的单行计算格式
echo "scale=6; 123.45 * 67.89 / 100" | bc -q
# 2. 高级数学函数计算,启用数学库
echo "scale=10; sqrt(2) + l(10)" | bc -lq
# 3. 进制转换:十进制转二进制
echo "obase=2; 100" | bc # 输出1100100
# 4. 进制转换:十六进制转十进制
echo "obase=10; ibase=16; FF" | bc # 输出255
# 5. shell脚本中获取计算结果
result=$(echo "scale=2; 100/3" | bc -q)
echo "计算结果为:$result"
注意事项:
- 小数精度问题:默认 scale=0,仅做整数运算,除法会直接舍弃小数部分,浮点计算必须先设置 scale 参数,或使用 - l 选项启用默认 20 位精度。
- 进制转换:ibase 设置输入数字的进制,obase 设置输出结果的进制,默认均为 10 进制;设置时需注意顺序,先设置 obase 再设置 ibase,避免进制混乱。
- 脚本兼容性:bc 支持条件判断(if)、循环(for/while)、自定义函数,可编写复杂的计算脚本,但不同平台的 bc 语法略有差异,跨平台使用建议遵循 POSIX 标准。
- 高精度优势:bc 支持任意精度的数值计算,不会出现 shell 算术运算的整数溢出问题,适合高精度的科学计算、财务计算场景。
二、查询软硬件相关指令
1. uname 指令(含 uname -r 核心用法)
语法:uname [选项]
功能:核心作用是查询系统内核、操作系统、硬件架构等核心信息,是 Linux 系统基础信息查询的核心命令,默认情况下:
- 不带选项时仅输出操作系统内核名称(Linux);
- 可通过不同选项,单独输出内核版本、硬件架构、主机名等细分信息;
- 输出结果无冗余,适合脚本中获取系统信息做判断。
基本用法:
直接执行命令,输出对应维度的系统信息,支持多个选项组合使用。
uname # 不带选项,输出内核名称,默认输出Linux
uname -r # 最常用,输出系统内核的发行版本号
uname -a # 输出所有系统核心信息,包含内核、主机名、架构、编译时间等
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -r | 内核发行版本:输出系统内核的版本号(如 5.15.0-105-generic) | 最核心常用选项,驱动安装、软件兼容性判断必用 |
| -a | 全部信息:输出所有系统核心信息,包含内核名称、主机名、内核版本、硬件架构、操作系统等 | 快速查看系统完整基础信息 |
| -s | 内核名称:输出操作系统内核名称,默认输出 Linux | 脚本中判断操作系统类型 |
| -v | 内核编译版本:输出内核的编译时间、发行补丁版本等详细信息 | 内核定制、漏洞排查时使用 |
| -m | 硬件架构:输出系统的硬件架构(如 x86_64、arm64、aarch64) | 软件安装时判断安装包对应架构,高频使用 |
| -n | 主机名:输出当前系统的主机名 | 等同于 hostname 命令,快速查看主机标识 |
| -o | 操作系统:输出操作系统名称,默认输出 GNU/Linux | 跨平台脚本中判断系统类型 |
常用选项组合:
# 1. 驱动安装必用:同时获取内核版本和硬件架构
uname -rm
# 2. 脚本中判断系统架构,执行对应安装逻辑
arch=$(uname -m)
if [ $arch == "x86_64" ];then
echo "x86 64位系统"
elif [ $arch == "aarch64" ];then
echo "ARM 64位系统"
fi
# 3. 快速获取系统核心标识信息
uname -snrvm
注意事项:
- 信息准确性:uname 输出的信息直接来自系统内核,无缓存,实时准确,不会出现配置文件修改导致的信息偏差。
- 跨平台兼容性:uname 是 POSIX 标准命令,所有 Unix/Linux 系统(包括 macOS)均支持,仅部分小众选项存在差异。
- 版本号解读:uname -r 输出的内核版本号,格式为 主版本。次版本。补丁版本 - 发行补丁,次版本偶数为稳定版,奇数为开发版。
2. free 指令
语法:free [选项]
功能:核心作用是查询系统内存的使用情况,包括物理内存、交换分区(Swap)、缓冲区、缓存的占用详情,默认情况下:
- 不带选项时以 KB 为单位输出内存数据;
- 实时读取系统 /proc/meminfo 文件,输出当前最新的内存占用状态;
- 区分可用内存、已用内存、缓存、缓冲区,清晰展示内存分配详情。
基本用法:
直接执行命令,输出系统内存、Swap 分区的使用详情,通过选项调整输出单位和格式。
free # 不带选项,默认以KB为单位输出内存使用情况
free -h # 最常用,以人类易读的单位(GB/MB)输出内存详情
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -h | 人类易读模式:自动适配 GB/MB/KB 单位,输出带单位的易读格式 | 最核心常用选项,手动查看内存必用 |
| -b/-k/-m/-g | 指定单位:分别以 Byte、KB、MB、GB 为单位输出内存数据 | 脚本中获取数值时使用,避免单位换算 |
| -s 秒数 | 持续刷新:每隔指定秒数,自动刷新输出一次内存数据 | 实时监控内存变化,如 free -h -s 1 每秒刷新一次 |
| -c 次数 | 刷新次数:配合 - s 使用,指定刷新的次数,完成后自动退出 | 如 free -h -s 2 -c 5 每 2 秒刷新一次,共刷新 5 次 |
| -t | 汇总行:在输出末尾添加一行物理内存 + Swap 的总合计值 | 快速查看系统总内存资源 |
| -w | 宽格式输出:将缓冲区(buffers)和缓存(cache)分开列示 | 更清晰区分两种不同类型的内存占用,新版 free 默认已分开 |
输出字段说明:
| 字段 | 含义说明 |
|---|---|
| total | 总内存 / 总 Swap 大小,系统物理内存总容量 |
| used | 已使用内存,包含应用程序、内核、缓存、缓冲区占用的总内存 |
| free | 完全空闲的内存,未被任何程序占用的内存 |
| shared | 共享内存,主要用于进程间通信的内存占用 |
| buff/cache | 缓冲区 + 页缓存,系统为提升 IO 性能占用的内存,可被应用程序回收使用 |
| available | 真正可用的内存,包含空闲内存 + 可回收的缓存 / 缓冲区,是判断系统剩余内存的核心指标 |
常用选项组合:
# 1. 手动查看首选:易读格式,带合计行
free -ht
# 2. 实时监控内存:每秒刷新一次,持续输出内存变化
free -h -s 1
# 3. 脚本中获取可用内存大小(单位MB)
free_available=$(free -m | grep Mem | awk '{print $7}')
echo "系统可用内存:${free_available}MB"
# 4. 一次性获取GB单位的内存详情
free -g
注意事项:
- 可用内存判断:Linux 系统会利用空闲内存做缓存提升性能,因此 free 值低不代表内存不足,核心看 available 值,available 值充足说明系统内存资源充足。
- Swap 分区说明:Swap 是硬盘上的交换分区,当物理内存不足时,系统会将不常用的内存数据置换到 Swap 中,Swap 占用过高会导致系统卡顿,建议物理内存充足时优化 Swap 使用阈值。
- 数据实时性:free 命令的数据直接来自 /proc/meminfo,是实时的内核数据,无延迟,可准确反映当前内存状态。
- 权限问题:free 命令无需 root 权限,普通用户即可正常执行,查看系统内存信息。
3. df 指令
语法:df [选项] [挂载点 / 设备路径]
功能:核心作用是查询文件系统的磁盘空间占用情况,包括磁盘总容量、已用容量、可用容量、使用率、挂载点等信息,默认情况下:
- 不带选项时以 1KB 块为单位,输出所有已挂载文件系统的磁盘使用情况;
- 可指定挂载点 / 设备,单独查询对应磁盘的占用详情;
- 支持查看 inode 使用情况,排查磁盘满但容量充足的 inode 耗尽问题。
基本用法:
直接执行命令,输出磁盘使用详情,通过选项调整输出单位、过滤内容。
df # 不带选项,默认以KB为单位输出所有已挂载文件系统的磁盘信息
df -h # 最常用,以人类易读的单位(GB/MB)输出磁盘占用详情
df -h / # 单独查询根目录所在磁盘的使用情况
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -h | 人类易读模式:自动适配 GB/MB/KB 单位,输出带单位的易读格式 | 最核心常用选项,手动查看磁盘占用必用 |
| -H | 十进制易读模式:以 1000 为进制换算单位(而非 1024),适配硬盘厂商标注容量 | 对比硬盘标称容量时使用 |
| -T | 显示文件系统类型:额外输出每一个挂载点的文件系统格式(如 ext4、xfs、tmpfs) | 排查文件系统兼容性、挂载问题时使用 |
| -t 文件系统类型 | 过滤显示:仅输出指定类型的文件系统信息 | 如 df -ht ext4 仅显示 ext4 格式的磁盘 |
| -x 文件系统类型 | 排除显示:排除指定类型的文件系统,不输出相关信息 | 如 df -hx tmpfs 排除临时文件系统,只看真实磁盘 |
| -i | 查看 inode 使用情况:输出 inode 的总量、已用、可用、使用率 | 排查 "磁盘提示满,但 df -h 看容量充足" 的 inode 耗尽问题 |
| --total | 汇总行:在输出末尾添加所有磁盘的总容量合计行 | 快速查看服务器整体磁盘资源 |
输出字段说明:
| 字段 | 含义说明 |
|---|---|
| Filesystem | 磁盘设备 / 文件系统名称,对应的磁盘分区或逻辑卷 |
| Type | 文件系统类型(-T 选项才会显示),如 ext4、xfs、vfat 等 |
| Size | 磁盘分区的总容量 |
| Used | 已使用的磁盘容量 |
| Avail | 可用的磁盘容量,普通用户可使用的剩余空间 |
| Use% | 磁盘空间使用率,核心监控指标,通常超过 85% 需预警 |
| Mounted on | 磁盘分区的挂载点,即该磁盘在系统中的访问路径 |
常用选项组合:
# 1. 手动查看首选:易读格式,显示文件系统类型,排除临时文件系统
df -hT -x tmpfs -x devtmpfs
# 2. 查看根目录所在磁盘的详细使用情况
df -h /
# 3. 排查inode耗尽问题,查看所有磁盘inode使用率
df -hi
# 4. 查看所有ext4/xfs格式的磁盘,带合计行
df -ht ext4,xfs --total
# 5. 脚本中获取根目录磁盘使用率
root_use=$(df -h / | grep / | awk '{print $5}' | sed 's/%//g')
echo "根目录磁盘使用率:${root_use}%"
注意事项:
- 磁盘满的两种场景:一种是磁盘容量(block)耗尽,df -h 看 Use% 100%;另一种是 inode 耗尽,df -i 看 IUse% 100%,通常是海量小文件导致,需针对性排查。
- 可用空间差异:Avail 值不等于 Size-Used,因为系统默认会为 root 用户预留 5% 的磁盘空间,用于系统紧急维护,普通用户无法使用这部分预留空间。
- 虚拟文件系统:tmpfs、devtmpfs 等是内存中的虚拟文件系统,不占用真实磁盘空间,查看物理磁盘时建议用 - x 选项排除,避免干扰判断。
- 权限问题:df 命令无需 root 权限,普通用户即可正常执行,查看所有已挂载的磁盘信息。
4. lscpu 指令
语法:lscpu [选项]
功能:核心作用是查询 CPU 的详细硬件信息,包括 CPU 架构、核心数、线程数、主频、缓存、NUMA 节点、支持的指令集等,默认情况下:
- 直接执行输出格式化的 CPU 完整信息,分类清晰,易读性强;
- 信息直接读取系统 /sys/devices/system/cpu/ 和 /proc/cpuinfo,数据准确无延迟;
- 无需 root 权限,普通用户即可执行,是 Linux 服务器 CPU 信息查询的首选命令。
基本用法:
直接执行命令,输出 CPU 的完整详细信息,通过选项过滤、格式化输出内容。
lscpu # 不带选项,输出CPU的完整分类信息
lscpu | grep "CPU(s)" # 过滤查看CPU核心/线程数相关信息
核心输出字段说明(高频关注项):
| 字段 | 含义说明 |
|---|---|
| Architecture | CPU 架构,如 x86_64、aarch64、armv7l 等 |
| CPU(s) | 总逻辑 CPU 数(总线程数),即超线程后的总线程数量 |
| Thread(s) per core | 每个核心的线程数,1 代表不支持超线程,2 代表开启超线程 |
| Core(s) per socket | 每个 CPU 插槽的物理核心数 |
| Socket(s) | CPU 插槽数,即服务器物理 CPU 的个数 |
| NUMA node(s) | NUMA 节点数,多 CPU 服务器的 NUMA 架构节点数量 |
| CPU MHz | CPU 当前主频 |
| CPU max MHz | CPU 支持的最大主频 |
| CPU min MHz | CPU 支持的最小主频 |
| L1d/L1i cache | CPU 一级数据缓存、一级指令缓存大小 |
| L2 cache | CPU 二级缓存大小 |
| L3 cache | CPU 三级缓存大小 |
| Flags | CPU 支持的指令集,如 vmx(虚拟化)、sse4.2、avx2、aes 等 |
| Virtualization | CPU 支持的虚拟化技术,如 VT-x、AMD-V |
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -p | 可解析格式输出:以冒号分隔的格式输出 CPU 信息,适合脚本解析 | 脚本中提取 CPU 核心、NUMA 节点信息时使用 |
| -e | 扩展格式输出:以表格形式输出每个逻辑 CPU 的详细信息,包括核心、插槽、NUMA 节点 | 查看每个 CPU 核心的详细归属、绑定信息 |
| -s 目录路径 | 指定系统根目录:用于查看虚拟机、chroot 环境中的 CPU 信息 | 系统运维、容器排查时使用 |
| -x | 显示十六进制的 CPU 掩码信息 | 高级 CPU 绑定、性能调优时使用 |
| -y | 显示物理 CPU 的拓扑结构信息 | 多 CPU 服务器 NUMA 架构、核心拓扑排查时使用 |
常用选项组合:
# 1. 快速查看CPU核心配置:物理CPU数、每个CPU核心数、总线程数
lscpu | grep -E "Socket|Core|CPU\(s\)" | head -4
# 2. 查看CPU缓存详情
lscpu | grep -E "L1|L2|L3"
# 3. 查看CPU支持的虚拟化技术
lscpu | grep -i virtualization
# 4. 以表格形式查看每个逻辑CPU的核心、NUMA节点归属
lscpu -e
# 5. 脚本中获取总逻辑CPU数
cpu_total=$(lscpu | grep "^CPU(s):" | awk '{print $2}')
echo "系统总CPU线程数:${cpu_total}"
注意事项:
- 物理核心与逻辑线程区分:总逻辑 CPU 数 = 插槽数 × 每个插槽核心数 × 每个核心线程数,超线程开启后,1 个物理核心对应 2 个逻辑线程,性能调优、程序绑核时需区分物理核心与逻辑线程。
- 指令集查看:Flags 字段的指令集信息,决定了 CPU 是否支持虚拟化、加密加速、高性能计算等特性,如 vmx/svm 指令集是开启 KVM 虚拟化的前提。
- 跨平台兼容性:lscpu 是 util-linux 包中的命令,绝大多数 Linux 发行版默认预装,嵌入式系统、极简发行版可能需要手动安装 util-linux。
- 权限问题:lscpu 命令无需 root 权限,普通用户即可正常执行,查看完整的 CPU 硬件信息。
三、时间相关指令
1. date 指令
语法:date [选项] [+ 输出格式]
功能:核心作用是查看或修改系统的日期与时间,支持自定义格式输出时间、时间戳转换、设置系统时间,是 Linux 系统时间管理的核心命令,默认情况下:
- 不带选项时,输出系统当前的本地时间(包含星期、月份、日期、时间、时区、年份);
- 支持格式化输出,可自定义时间的显示格式,提取年、月、日、时、分、秒、时间戳等细分字段;
- 可配合选项修改系统时间,需 root 权限。
基本用法:
查看当前时间语法:date [+ 输出格式]直接执行输出当前系统时间,通过格式符自定义输出内容。
date # 不带选项,输出系统当前完整本地时间,如:Mon Mar 10 10:20:30 CST 2025
date +"%Y-%m-%d %H:%M:%S" # 最常用,输出格式化的年-月-日 时:分:秒,如:2025-03-10 10:20:30时间戳转换
1. 查看当前时间的秒级时间戳(Unix时间戳,从1970-01-01 00:00:00 UTC到现在的秒数)
date +%s
2. 时间戳转日期时间:将指定秒级时间戳转换为可读格式
date -d @1741573230 # 输出时间戳对应的本地时间
date -d @1741573230 +"%Y-%m-%d %H:%M:%S" # 格式化输出时间戳对应的时间查看相对时间
date -d "3 days ago" # 查看3天前的时间
date -d "next Monday" # 查看下周一的日期
date -d "1 month ago" +"%Y-%m-%d" # 查看1个月前的日期,格式化输出修改系统时间(需 root 权限)
格式:date -s "年-月-日 时:分:秒"
sudo date -s "2025-03-10 10:30:00" # 将系统时间设置为指定的日期时间
sudo date -s "10:30:00" # 仅修改时间,日期保持不变
常用格式符说明:
| 格式符 | 功能描述 | 输出示例 |
|---|---|---|
| %Y | 4 位完整年份 | 2025 |
| %y | 2 位年份 | 25 |
| %m | 2 位月份(01-12) | 03 |
| %d | 2 位日期(01-31) | 10 |
| %H | 24 小时制的小时(00-23) | 14 |
| %I | 12 小时制的小时(01-12) | 02 |
| %M | 2 位分钟(00-59) | 20 |
| %S | 2 位秒数(00-59) | 30 |
| %s | 秒级 Unix 时间戳 | 1741573230 |
| %A | 完整星期名称 | Monday |
| %a | 缩写星期名称 | Mon |
| %B | 完整月份名称 | March |
| %b | 缩写月份名称 | Mar |
| %Z | 系统时区 | CST |
| %j | 当年的第几天(001-366) | 069 |
| %w | 星期几(0 = 周日,6 = 周六) | 1 |
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -d 时间字符串 | 显示指定的时间,而非当前时间,支持相对时间、时间戳转换 | 最核心常用选项,时间转换、相对时间计算必用 |
| -s 时间字符串 | 设置系统时间,将系统时间修改为指定的时间 | 需 root 权限,修改后建议同步硬件时钟,避免重启后失效 |
| -R | 输出 RFC 2822 格式的时间 | 邮件、日志等场景的标准时间格式 |
| -I | 输出 ISO 8601 格式的日期 | 如 2025-03-10,标准化日期输出 |
| -u | 输出 UTC 世界标准时间,而非本地时区时间 | 跨时区服务、日志统一时间戳时使用 |
| -r 文件路径 | 输出指定文件的最后修改时间 | 查看文件更新时间,替代 ls -l 的简化用法 |
常用选项组合:
# 1. 日志文件名高频用法:生成格式化的当前日期,用于日志、备份文件名
date +"%Y%m%d" # 输出20250310
backup_file="data_backup_$(date +%Y%m%d).tar.gz"
# 2. 脚本中获取当前完整格式化时间
current_time=$(date +"%Y-%m-%d %H:%M:%S")
echo "脚本执行时间:${current_time}"
# 3. 时间格式转换:将指定日期转换为时间戳
date -d "2025-03-10 10:30:00" +%s
# 4. 查看UTC标准时间,格式化输出
date -u +"%Y-%m-%d %H:%M:%S"
# 5. 查看指定文件的最后修改时间,格式化输出
date -r /etc/passwd +"%Y-%m-%d %H:%M:%S"
严禁执行的操作:
# 严禁在生产服务器随意修改系统时间,尤其是往回修改时间
# 错误示例:sudo date -s "2020-01-01"
# 会导致日志、数据库、定时任务、证书验证等大量服务异常,甚至业务崩溃
注意事项:
- 系统时间与硬件时钟:date 修改的是系统时间(内核维护的软件时间),服务器重启后会读取硬件时钟(BIOS 时间),修改系统时间后,建议执行
sudo hwclock -w将系统时间同步到硬件时钟,避免重启失效。- 时区问题:date 默认输出本地时区时间,国内服务器默认是 CST(东八区),跨时区业务建议统一使用 UTC 时间,避免时区混乱。
- 时间同步:生产服务器建议配置 NTP 时间同步服务,自动校准系统时间,避免手动修改时间导致的业务异常,手动修改时间仅适用于测试环境、无网络环境。
- 时间戳范围:date 支持的 Unix 时间戳为 32 位和 64 位,64 位系统无 2038 年问题,可正常转换远期时间。
- 权限问题:查看时间无需 root 权限,修改系统时间、同步硬件时钟必须使用 root 权限(sudo)。
2. cal 指令
语法:cal [选项] [月份] [年份]
功能:核心作用是在终端中输出日历,支持查看当月、指定月份、指定年份的日历,默认情况下:
- 不带选项和参数时,输出当前月份的日历,高亮显示当天日期;
- 支持指定月份和年份,查看对应时间的日历;
- 支持查看全年日历、指定年份的日历,是 Linux 终端快速查看日历的便捷工具。
基本用法:
查看当前月份日历语法:cal直接执行,输出当前月份的日历,高亮显示当天日期。
cal # 不带参数,输出当前月份的日历
查看指定年份的全年日历
cal 2025 # 输出2025年全年的日历
cal 2026 # 输出2026年全年的日历查看指定月份的日历语法:cal [月份] [年份]月份为 1-12 的数字,年份为 4 位完整年份,必须同时指定月份和年份。
cal 3 2025 # 输出2025年3月的日历
cal 10 2026 # 输出2026年10月的日历
可跟选项:
| 选项 | 功能描述 | 使用提示 |
|---|---|---|
| -1 | 仅显示当前月份的日历(默认行为) | 无特殊需求可省略,默认就是单月显示 |
| -3 | 显示前一个月、当前月、后一个月,三个月的日历 | 快速查看相邻月份的日期,高频常用选项 |
| -y | 显示当前年份的全年日历 | 等同于 cal 当前年份,快速查看全年日历 |
| -j | 儒略日格式:显示日期为当年的第几天(1-366),而非当月的日期 | 计算日期间隔、日志排查时使用 |
| -m | 周一作为每周的第一天 | 默认日历周日为每周第一天,此选项适配国内习惯,周一开头 |
| -s | 周日作为每周的第一天(默认行为) | 恢复默认的日历显示格式 |
| -w | 在每周的行首显示该周是当年的第几周 | 周度统计、项目排期时使用 |
常用选项组合:
# 1. 国内用户首选:当前月份日历,周一为每周第一天,显示周数
cal -mw
# 2. 查看相邻三个月日历,周一为每周第一天
cal -3m
# 3. 查看当前年份全年日历,周一为每周第一天
cal -ym
# 4. 查看指定月份的儒略日格式,计算日期间隔
cal -j 3 2025
# 5. 查看2025年全年日历,带周数,周一开头
cal -ymw 2025
注意事项:
- 日期格式适配:国内用户习惯周一作为一周的第一天,建议固定搭配 - m 选项使用,符合日常日历查看习惯。
- 年份参数规范:cal 命令的年份必须输入 4 位完整年份,输入 2 位数字(如 cal 3 25)会被识别为公元 25 年,而非 2025 年,务必注意。
- 跨平台兼容性:cal 是 POSIX 标准命令,所有 Linux 发行版、macOS、Unix 系统均默认预装,无需额外安装。
- 高亮显示:终端中 cal 命令会默认高亮显示当天的日期,部分极简终端、远程终端可能不支持高亮,会以下划线、反白等方式标注。
- 权限问题:cal 命令无需 root 权限,普通用户即可正常执行,所有功能均无权限限制。
四、常用热键
Linux 终端(Bash/Zsh Shell)的常用快捷键,用于提升命令行操作效率,分为光标移动、文本编辑、命令控制、历史命令四大类,默认情况下:
- 所有热键均在终端命令行界面生效,无需额外安装工具;
- 热键不区分大小写,Ctrl 组合键按下 Ctrl + 对应字母即可触发;
- 适用于绝大多数 Linux 发行版的默认 Shell 环境,跨平台兼容性强。
一、光标移动类热键
| 热键 | 功能描述 | 使用场景 |
|---|---|---|
| Ctrl + a | 光标快速移动到当前命令行的行首 | 命令很长,需要修改开头的参数 / 命令时,一键到行首 |
| Ctrl + e | 光标快速移动到当前命令行的行尾 | 命令很长,需要在末尾添加参数时,一键到行尾 |
| Ctrl + b | 光标向左移动一个字符(等同于左方向键) | 微调光标位置,修改单个字符 |
| Ctrl + f | 光标向右移动一个字符(等同于右方向键) | 微调光标位置,修改单个字符 |
| Alt + b | 光标向左移动一个单词(以空格 / 符号分隔) | 快速跳过单词,修改命令中间的参数 |
| Alt + f | 光标向右移动一个单词(以空格 / 符号分隔) | 快速跳过单词,在命令中间添加参数 |
二、文本编辑类热键
| 热键 | 功能描述 | 使用场景 |
|---|---|---|
| Ctrl + u | 删除光标位置到行首的所有内容 | 命令输入错误,一键清空行首到光标处的内容,重新输入 |
| Ctrl + k | 删除光标位置到行尾的所有内容 | 保留行首的命令,一键删除后面的所有参数,重新填写 |
| Ctrl + w | 删除光标左侧的一个单词(以空格分隔) | 输错了最后一个参数,一键删除,重新输入 |
| Alt + d | 删除光标右侧的一个单词 | 删除光标后面的错误参数,无需反复按删除键 |
| Ctrl + d | 删除光标当前位置的单个字符(等同于 Delete 键) | 光标在字符前方时,删除该字符 |
| Ctrl + h | 删除光标左侧的单个字符(等同于 Backspace 键) | 退格删除,部分无退格键的终端使用 |
| Ctrl + y | 粘贴之前通过 Ctrl+u/Ctrl+k/Ctrl+w 删除的内容 | 误删内容后一键恢复,或复制删除的内容到其他位置 |
| Ctrl + t | 交换光标当前位置和前一个位置的字符 | 输错两个字符的顺序,一键交换,无需删除重输 |
| Alt + t | 交换光标当前位置和前一个位置的单词 | 输错两个参数的顺序,一键交换 |
| Alt + . | 粘贴上一条命令的最后一个参数 | 连续多条命令使用同一个文件 / 路径,一键复用,无需重复输入 |
三、命令控制类热键
| 热键 | 功能描述 | 使用场景 |
|---|---|---|
| Ctrl + c | 强制终止当前正在前台运行的命令 / 进程,中断执行 | 命令卡死、执行时间过长、输入错误命令执行时,一键终止 |
| Ctrl + z | 暂停当前正在前台运行的进程,将其放到后台挂起 | 进程运行中,需要临时回到终端操作,后续可通过 fg/bg 恢复进程 |
| Ctrl + d | 退出当前 Shell 终端 / 登录会话,等同于 exit 命令 | 结束终端会话、退出 SSH 登录、退出 Python/MySQL 等交互式环境 |
| Ctrl + l | 清空终端屏幕,等同于 clear 命令 | 终端输出内容太多,一键清屏,保持界面整洁 |
| Ctrl + s | 锁定终端屏幕,暂停屏幕输出 | 终端输出内容过快,暂停输出查看内容 |
| Ctrl + q | 解锁终端屏幕,恢复屏幕输出 | 解除 Ctrl+s 的锁定,继续正常输出 |
| Tab | 命令 / 路径 / 文件名自动补全 | 最核心常用热键,输入命令、路径、文件名的前几个字符,按 Tab 自动补全,按两次 Tab 列出所有匹配项,大幅提升输入效率,避免输错 |
四、历史命令类热键
| 热键 | 功能描述 | 使用场景 |
|---|---|---|
| Ctrl + p | 向上切换历史命令(等同于上方向键) | 查看上一条执行过的命令 |
| Ctrl + n | 向下切换历史命令(等同于下方向键) | 查看下一条执行过的命令 |
| Ctrl + r | 反向搜索历史命令,进入搜索模式后,输入关键词,自动匹配包含该关键词的历史命令 | 执行过的长命令,无需翻找,输入关键词一键搜索复用,高频常用 |
| Ctrl + g | 退出 Ctrl+r 的历史命令搜索模式,回到正常命令行 | 搜索不到目标命令,退出搜索模式 |
| !! | 执行上一条命令(两个感叹号,回车执行) | 上一条命令权限不足,直接执行 sudo !! 即可用 root 权限重新执行上一条命令,高频常用 |
| ! 关键词 | 执行最近一条以指定关键词开头的历史命令 | 如!ssh,执行最近一条以 ssh 开头的命令,快速复用 |
注意事项:
- 热键优先级:终端热键的优先级高于运行中的程序,例如 Ctrl+c 会优先被 Shell 捕获,终止前台进程,除非程序单独设置了信号捕获。
- 兼容性说明:Alt 组合键在部分远程终端工具(如 Xshell、Putty)中可能需要单独配置,部分工具默认将 Alt 键作为菜单快捷键,可修改终端配置启用 Alt 组合键。
- 安全提示:Ctrl+c 仅能终止前台进程,后台运行的进程无法通过此热键终止,需使用 kill 命令终止。
- 效率核心:Tab 自动补全、Ctrl+r 历史搜索、Ctrl+a/Ctrl+e 行首行尾跳转、Ctrl+c 终止命令,是 Linux 终端最高频的 5 个热键,熟练掌握可大幅提升命令行操作效率。
感谢阅读,本文如有错漏之处,烦请各位斧正。























