RHCSA 学习笔记(一):命令行基础、用户权限、文本处理与进程管理

学习红帽课程中的一些笔记,本系列共 3 篇,这是第 1 篇。

Linux系统基础快捷键

功能分类 快捷键 核心用途 / 考场高效技巧
光标快速定位 Ctrl + A 快速跳转至行首(无需长按左方向键)。
Ctrl + E 快速跳转至行尾。
高效文本修正 Ctrl + U 剪切/删除从光标位置至行首的所有内容(输错复杂命令时快速清空)。
Ctrl + K 剪切/删除从光标位置至行尾的所有内容。
Ctrl + W 删除光标左侧的一个单词(修正参数极快)。
Alt + . 快速粘贴上一条命令的最后一个参数(如 vim /path/to/file 后接 cat / ls 时无需重新打路径)。
历史命令搜索 Ctrl + R 反向搜索历史命令,输入关键字快速复用长命令。
sudo !! (输入命令) 重新用 sudo 执行上一条因权限不足报错的命令。
进程与终端控制 Ctrl + C 强制中断当前前台运行的命令(如 Ping 或卡住的脚本)。
Ctrl + Z 挂起进程至后台(搭配 bg 后台运行或 fg 切回前台)。
Ctrl + L 快速清屏(保持当前已输入内容不丢失)。
Ctrl + D 退出/注销当前 Shell(相当于 exit,快速退出 SSH 或切换用户)。
补全与效率 Tab (按两次) 自动补全命令/路径/参数,按两次列出所有匹配项(考场拼写检查利器)。

文件系统结构和文件管理命令

文件结构

目录路径 英文名称 / 含义 核心作用与主要内容 常见文件 / 子目录示例
/ Root Directory 根目录。整个文件系统的起点,所有文件、目录和设备挂载点均由它延伸。 —
/bin →
/usr/bin
User Binaries 基础用户命令。包含系统所有用户(普通用户和管理员)均可调用的基础二进制可执行命令(现代系统通常软链接至 /usr/bin)。 ls, cd, cp, mv, cat
/sbin →
/usr/sbin
System Binaries 系统管理命令。包含超级管理员(root)用于系统维护、网络配置及关机等的高权限命令(现代系统通常软链接至 /usr/sbin)。 fdisk, ip, reboot, iptables
/etc Editable Text Configuration 核心系统配置文件。包含系统所有服务、应用程序、网络及全局环境的纯文本配置文件。 ansible.cfg, fstab, hosts, ssh/
/home User Home Directories 普通用户家目录。系统为每个普通用户创建的个人专属工作空间,存放用户的个人配置文件与文档。 /home/user1, /home/dev
/root Root Home Directory 超级管理员(root)家目录。独立于 /home 之外,确保即使 /home 挂载分区故障,root 用户仍能登录维护系统。 /root/.bashrc, /root/scripts/
/var Variable Data Files 动态变化数据。存放体积频繁增减或持续追加的文件,如系统日志、服务数据库、邮件队列和缓存。 /var/log/, /var/lib/docker/, /var/spool/
/usr User System Resources 用户系统资源。存放只读的应用软件和库文件(类似于 Windows 的 Program Files),大部分通过包管理器安装的程序均在此。 /usr/bin, /usr/lib, /usr/local
/boot Boot Loader Files 引导与启动文件。存放系统启动必需的核心文件,包括内核镜像(vmlinuz)、初始化 RAM 磁盘(initramfs)及 GRUB 引导器。 vmlinuz-*, initramfs-*.img, grub2/
/dev Device Files 设备文件。Linux 秉承“一切皆文件”原则,所有物理硬件与虚拟设备均在此体现为抽象文件。 /dev/sda (硬盘), /dev/null, /dev/zero
/proc Process Information 内存虚拟文件系统。不占用硬盘空间,将当前正在运行的进程状态与内核参数实时映射为文件。 /proc/cpuinfo, /proc/meminfo, /proc/sys/
/sys System 内存虚拟文件系统。与内核底层设备模型配合,导出硬件设备的层级结构与驱动控制接口。 /sys/block/, /sys/class/net/
/tmp Temporary Files 临时文件。供系统和软件在运行时存放临时数据,系统重启或定期脚本会自动清理该目录。 *.tmp, 运行时临时缓存
/opt Optional Application Software 可选第三方软件。用于手动安装独立的第三方大型软件套件(通常不依赖系统默认包管理器)。 /opt/google/, /opt/containerd/
/media Removable Media 可移动介质挂载点。系统自动挂载 U 盘、光驱、移动硬盘等便携设备时的默认路径。 /media/usb
/mnt Mount 临时挂载点。供系统管理员手动临时挂载其他磁盘分区、网络共享目录(NFS/CIFS)等。 /mnt/data, /mnt/nfs
/lib →
/usr/lib
/lib64 →
/usr/lib64
Libraries 动态共享库。存放 /bin 和 /sbin 中的命令运行所依赖的核心动态链接库(类似于 Windows 的 .dll 文件)。 libc.so.*, ld-linux.so

文件相关的管理命令

命令 核心功能 常用选项 / 参数 实用操作示例 深度解析与注意事项
mkdir 创建文件夹
(Make Directory)
• -p:递归创建多级子目录
• -v:显示创建过程的详细信息
mkdir -p project/src/bin 使用 -p 参数可以一次性创建尚不存在的多层嵌套目录,若目录已存在也不会报错。
rmdir 删除空文件夹
(Remove Directory)
• -p:递归删除上一层空目录
• --ignore-fail-on-non-empty:忽略非空报错
rmdir empty_dir 只能删除空目录。如果目录下存在任何文件或子目录,命令将报错拒绝执行(安全性保护)。
rm 删除文件或目录
(Remove)
• -r / -R:递归删除(用于目录)
• -f:强制删除,不提示确认
• -i:删除前逐一询问确认
rm -rf project/ 危险系数高!使用 rm -rf 时需极其谨慎,文件一旦删除无法从回收站恢复;建议配合 -i 校验。
cp 拷贝文件或目录
(Copy)
• -r / -R:递归复制整个目录
• -a:归档模式(保留权限/时间戳/软链接等属性)
• -v:显示复制过程
cp -a /etc/ansible ./ 复制文件夹时必须添加 -r 或 -a 选项;使用 -a 参数在备份配置文件时能完全保留原文件的所有者与权限属性。
mv 移动或重命名文件/目录
(Move)
• -n:不覆盖已存在的目标文件
• -f:强行覆盖不提示
• -i:覆盖前提示确认
mv old.txt new.txt
mv file.txt /tmp/
源路径与目标路径在同一目录下为“重命名”;在不同目录下为“移动”。跨文件系统移动文件时实质是“复制后删除”。
file 查看文件真实类型
(File Type)
• -b:简略模式,不显示文件名
• -i:输出标准的 MIME 类型字符串
file /usr/bin/ls
file image.png
Linux 不依赖文件后缀名判断类型。file 通过探测文件开头的“魔数”(Magic Number)来识破真实格式(如可执行文件、文本、压缩包等)。

用户和权限管理

graph LR
    %% 静态身份区域
    subgraph 静态身份 ["/etc/passwd | group"]
        B["主组/初始用户组"]
        C["附加组"]
    end

    %% 动态状态区域
    subgraph 动态状态 ["动态状态 (id 命令查看)"]
        subgraph E ["支持用户组 (groups)"]
            subgraph D ["有效用户组 (gid)"]
                F["决定新建文件的所属组"]
            end
            G["决定能访问哪些组的文件"]
        end
    end

    %% 核心纽带与初始化流向
    B -->|默认初始化| D
    C -->|默认初始化| E

    %% 外部命令动作
    H[["命令: newgrp 目标组"]] -.->|临时切换有效组<br>需为小组成员或输入组密码| D

    %% 样式定义
    style B fill:#f9f,stroke:#333,stroke-width:2px
    style C fill:#bbf,stroke:#333,stroke-width:2px
    style D fill:#f96,stroke:#333,stroke-width:1px
    style E fill:#6c6,stroke:#333,stroke-width:2px
    style H fill:#fff,stroke:#333,stroke-width:2px

用户信息配置

密码文件 /etc/passwd

/etc/passwd 记录 Linux 系统上所有用户账号的基本属性信息(用户名、UID、GID、家目录、默认 Shell 等)。

1
2
3
4
5
6
7
8
root:x:0:0:root:/root:/bin/bash
│ │ │ │ │ │ └─ 7. 登录 Shell (Login Shell)
│ │ │ │ │ └─────── 6. 家目录 (Home Directory)
│ │ │ │ └───────────── 5. 备注信息 (GECOS / Comment)
│ │ │ └──────────────── 4. 主组 ID (GID)
│ │ └────────────────── 3. 用户 ID (UID)
│ └──────────────────── 2. 密码占位符 (Password)
└──────────────────────── 1. 登录名 (Username)

暗码文件 /etc/shadow

/etc/shadow 用于存储用户账号的哈希加密密码(Password Hash)以及密码有效期、到期警告等安全策略。

1
2
3
4
5
6
7
8
9
10
root:$6$xyz...123:19720:0:99999:7:14:20088:
│ │ │ │ │ │ │ │ └─ 9. 保留字段 (Reserved)
│ │ │ │ │ │ │ └────── 8. 账号失效日期 (Expiration Date)
│ │ │ │ │ │ └───────── 7. 宽限天数 (Inactive Days)
│ │ │ │ │ └─────────── 6. 到期警告天数 (Warning Days)
│ │ │ │ └───────────────── 5. 密码最大有效天数 (Max Days)
│ │ │ └─────────────────── 4. 密码最小修改间隔天数 (Min Days)
│ │ └───────────────────────── 3. 上次修改密码日期 (Last Change)
│ └────────────────────────────────────── 2. 加密密码 (Encrypted Password)
└────────────────────────────────────────── 1. 登录名 (Username)
字段序号 字段名称 计数基准 / 换算公式 详细解读与应用场景
3 上次修改密码日期
(Last Change)
Unix 纪元天数
以 1970-01-01 为第 0 天开始累加。

换算公式:
目标日期 = 1970-01-01 + 天数
• 示例(以 19720 为例):
从 1970年1月1日 往后加 19720 天,对应日期为 2024 年 1 月 3 日(表示该账号上次修改密码是在这一天)。

• 特殊值:
0:表示用户下次登录时必须立即修改密码(常用于管理员为新用户初始化密码)。
4 密码最小修改间隔天数
(Min Days)
相对天数
修改密码后必须等待的天数。
• 示例(以 0 为例):
表示无限制,用户可以在一天内随时修改多次密码。

• 安全作用(若设为 7):
用户修改密码后,最快必须等 7 天后才能再次修改。这可以防止用户为了绕过“历史密码不能重复”策略而连续快速修改密码。
5 密码最大有效天数
(Max Days)
相对天数
密码保持有效的最长期限。
• 示例(以 99999 为例):
99999 天约等于 273 年,相当于密码永不过期(系统默认值)。

• 合规场景(若设为 90):
配合字段 3 算出的日期,密码将在上次修改后的第 90 天强制过期,系统会要求必须更换密码。
6 到期警告天数
(Warning Days)
倒计时天数
密码过期前的提醒窗口。
• 示例(以 7 为例):
在密码即将过期的前 7 天内,用户每次通过 SSH 或终端登录时,系统都会输出警告消息:Warning: your password will expire in X days. 提醒提前更换。
7 宽限天数
(Inactive Days)
相对天数
密码过期后的“缓冲期”。
• 示例(若设为 14):
如果密码过期后用户一直没改,在过期后的 14 天内登录,系统仍允许其登录并修改密码;若超过 14 天依然未修改,账号将进入 Inactive(失效锁定) 状态,此时用户自行改密码也无效,必须由 root 解锁。

• 留空(默认):
表示无宽限期,一旦密码过期立即无法登录。
8 账号失效日期
(Expiration Date)
Unix 纪元天数
以 1970-01-01 为第 0 天开始累加。
• 绝对截止时间(与密码是否过期无关):
主要用于外包人员、临时工或有明确离职/到期日期的账号。

• 示例(若设为 20088):
对应日期为 2025 年 1月 6 日。到了这一天,无论密码是否刚刚修改过,该账号彻底禁止登录。

• 留空(默认):
表示账号永久有效。

Gemini 拓展
你可能会觉得既然 /etc/passwd 里现在根本没有密码(都移到 shadow 里去了),官方为什么还叫它 Password file?
这其实是一个历史包袱。在 20 世纪 70、80 年代 Unix 刚诞生时,密码的加密串确实是直接写在这个文件里的。后来为了安全才剥离出了 shadow 机制。
但因为无数的底层 C 语言标准库函数(比如 getpwnam,全称就是 get pwassword name)和历史命令都绑定了这个名字,所以官方一直沿用了 Password file 这个古老的叫法,而在技术上通过引入 Shadow password file 来打补丁。

用户管理命令

命令 核心功能 常用选项 / 参数 实用操作示例 深度解析与注意事项
id 查看用户 ID 及组归属 • (无参数):查看当前用户
• username:查看指定用户
• -u:仅输出 UID
• -g:仅输出主组 GID
• -G:输出所有所属组 GID
id
id devuser
用于快速核验用户的身份标识,输出包含:UID(用户ID)、GID(主组ID)以及 groups(所有附加组列表)。
useradd 创建新用户
(或 adduser)
• -u:指定 UID
• -g:指定初始主组(组名或 GID)
• -G:指定附加组(多个用逗号隔开)
• -d:指定家目录路径
• -s:指定默认 Shell
useradd -s /sbin/nologin -G docker appuser 创建用户时,系统会默认参考 /etc/default/useradd 和 /etc/skel/ 模板文件夹。指定 -s /sbin/nologin 可创建不可登录的服务账号。
userdel 删除用户 • -r:递归删除家目录及邮件池
• -f:强制删除(即使该用户当前已登录)
userdel -r olduser 非常重要: 不加 -r 参数只会从 /etc/passwd 中移除账号记录,其家目录(/home/username)仍会残留在磁盘上变成“无主文件”。
usermod 修改已有用户信息 • -aG:追加附加组(必须配合 -a,否则会覆盖原有附加组)
• -l:修改登录用户名
• -s:修改默认 Shell
• -L / -U:锁定 / 解锁账号
usermod -aG wheel devuser
usermod -s /bin/bash devuser
运维最常用 usermod -aG 给用户添加提权组(如 wheel 或 sudo)。切记:如果不加 -a 只写 -G,会导致该用户从之前的所有附加组中被移除!
passwd 修改用户密码 • (无参数):修改当前登录用户的密码
• username:修改指定用户的密码(仅 root 可用)
• -l / -u:锁定 / 解锁用户密码
• -d:删除用户密码(清空后可免密登录)
• --stdin:从标准输入读取密码(脚本批量设置密码神技)
passwd
echo "Password123" | passwd --stdin devuser
普通用户修改自己密码需要遵循复杂性校验规则;root 管理员可以强行修改任意用户的密码且无需校验旧密码。
chage 修改用户密码时效策略
(Change Age)
• -l:查看用户的密码到期与时效详细报告
• -M:设置密码最大有效天数
• -m:设置密码最小修改间隔天数
• -W:设置到期警告天数
• -d 0:强制用户下一次登录时必须修改密码
chage -l devuser
chage -M 90 -W 7 devuser
chage -d 0 devuser
直接操作 /etc/shadow 中关于天数限制的第 3 至第 8 字段。RHCE 考试中常用于配置企业级安全合规策略(如强制 90 天换密码、首次登录改密码等)。

组信息配置

用户组文件 /etc/group

/etc/group 记录了系统上所有用户组的基本属性,包括组名称、组 ID(GID)以及该组包含哪些成员用户。该文件对所有用户全局可读(权限 644),以便系统和程序能够将数字 GID 映射为可读的组名。

1
2
3
4
5
wheel:x:10:root,devuser
│ │ │ └─ 4. 附加组成员列表 (Group Members) 主组用户不会显示
│ │ └──── 3. 组 ID (GID)
│ └────── 2. 组密码占位符 (Group Password)
└────────── 1. 组名 (Group Name)

暗码组文件 /etc/gshadow

/etc/gshadow 是 /etc/group 的安全补充文件,存储了用户组的加密密码以及组管理员(Group Administrators)信息。为了防止未授权用户破译密码,该文件具有极高权限限制(仅 root 可读写,权限通常为 000 或 400)。

1
2
3
4
5
wheel:$6$abc...789:root:devuser,testuser
│ │ │ └─ 4. 附加组成员列表 (Group Members)
│ │ └────── 3. 组管理员列表 (Group Administrators)
│ └─────────────────── 2. 加密组密码 (Encrypted Group Password)
└─────────────────────── 1. 组名 (Group Name)

用户组相关管理命令

命令 核心功能 常用选项 / 参数 实用操作示例 深度解析与注意事项
groupadd 创建新用户组 • -g:指定组 ID (GID)
• -r:创建系统用户组(GID 小于 1000)
groupadd -g 2000 devgroup
groupadd -r sysadmin
创建组时,系统会自动在 /etc/group 和 /etc/gshadow 中同步添加条目。指定 -r 参数可用于创建系统服务专用的组。
groupmod 修改已有用户组属性 • -n:修改组名
• -g:修改组 ID (GID)
groupmod -n newgroup oldgroup
groupmod -g 2005 devgroup
修改 GID 后,原本属于该组的文件在磁盘上的 GID 不会自动变更,会导致那些文件显示为“无主 GID”(需要手动使用 chgrp 或 find 进行修复)。
groupdel 删除用户组 • (无特殊常用选项) groupdel devgroup 非常重要: 不能删除任何现有用户的初始主组(Primary Group)。如果某组仍是某个用户的初始主组,必须先修改该用户的初始主组或删除该用户后,才能删除该组。
groupmems 管理指定组的成员
(需 root 或组管理员权限)
• -g:指定要操作的目标组
• -a:添加用户到组
• -d:从组中删除用户
• -l:列出该组的所有成员
• -p:清空该组所有成员
groupmems -g devgroup -a user1
groupmems -g devgroup -l
比 usermod 更专注于“以组为中心”的成员管理,操作时直接修改 /etc/group 和 /etc/gshadow 中的成员列表。
gpasswd 管理组密码、成员及组管理员 • -a:添加用户到组
• -d:从组中移除用户
• -A:指定组管理员
• -r:删除组密码
• -M:批量设置组成员(覆盖式)
gpasswd -a user1 devgroup
gpasswd -d user1 devgroup
gpasswd -A manager1 devgroup
功能极强:不仅可以像 usermod 一样添加/删除成员,还能设置组密码(保存在 /etc/gshadow),以及指定组管理员(让普通用户无需 root 权限即可管理该组成员)。

文件权限

文件权限的表达方式

符号表达 八进制数值 对应权限含义 (对文件) 对应权限含义 (对目录)
r-- 4 仅允许读取文件内容 (cat, less) 仅允许查看目录内的文件名列表 (ls)
-w- 2 仅允许修改文件内容 (vim, >) 仅允许在目录内创建、删除、重命名文件
--x 1 仅允许将文件作为程序/脚本执行 仅允许进入该目录 (cd) 或访问内部文件
--- 0 无任何权限 无任何权限
s-- (SUID) 4 (前置位) 运行该文件时,执行者临时获得文件所有者的权限 (如 /usr/bin/passwd) 无实际特殊含义
-s- (SGID) 2 (前置位) 运行该文件时,执行者临时获得文件所属组的权限 目录下新建的文件/子目录会自动继承该目录的所属组(常用于协同共享目录)
--t (Sticky) 1 (前置位) 无实际通用含义(早期用于缓存程序在内存中) 目录对所有人开放写权限,但仅文件创建者和 root 才能删除或修改内部文件 (如 /tmp)
1
2
3
4
5
- rwx r-x r--
│ │ │ └─ [3] 其他人权限 (Others): r-- = 4+0+0 = 4 (只读)
│ │ └───── [2] 所属组权限 (Group) : r-x = 4+0+1 = 5 (读+执行)
│ └───────── [1] 所有者权限 (User) : rwx = 4+2+1 = 7 (读+写+执行)
└──────────── [0] 文件类型 : - (普通文件) / d (目录) / l (软链接)

文件权限的查看以及修改

命令 核心功能 常用选项 / 参数 实用操作示例 深度解析与注意事项
ls -l 查看文件权限及详细属性 • -a:显示所有文件(包含 . 开头的隐藏文件)
• -d:仅显示目录本身的属性,而非目录内的文件内容
• -h:以人类可读的格式显示文件大小(如 K、M、G)
• -Z:显示文件的 SELinux 安全上下文(RHCE 必考)
ls -la
ls -ldh /var/log
ls -lZ /var/www/html
第一列共 10 位字符(如 -rwxr-xr--),第 1 位表示文件类型,后 9 位每 3 位一组,分别代表所有者 (u)、所属组 (g) 和其他人 (o) 的基础权限与特殊权限。
chmod 修改文件或目录的访问权限
(Change Mode)
• -R:递归修改目录及其内部所有文件和子目录的权限
• u/g/o/a:指定操作对象(所有者/所属组/其他人/全部)
• +/-/=:指定权限变更动作(增加/移除/精准赋值)
• 4 位八进制数:设置包含特殊权限在内的绝对数字权限
chmod 755 script.sh
chmod -R 770 /project
chmod u+x,g-w file.txt
chmod 2770 /shared_dir
支持八进制数字法(如 755)和符号表示法(如 u+x)。使用四位八进制数时,千位代表特殊权限:SUID (4)、SGID (2)、Sticky Bit (1)。给协同目录设置 SGID(如 chmod 2770)是 RHCE 考试的高频考点。
chown 修改文件或目录的所有者和所属组
(Change Owner)
• -R:递归修改目录及其内部所有文件的所有者与所属组
• --reference=ref_file:参照指定文件的属主与属组进行修改
chown devuser file.txt
chown devuser:devgroup /app
chown -R nginx:nginx /var/www/html
仅 root 管理员可执行。使用 用户:组 语法可以一次性同时修改所有者和所属组;如果只写 chown :groupname file,效果等同于 chgrp;若写 chown user: file,则会把所属组自动同步修改为该用户的初始主组。
chgrp 仅修改文件或目录的所属组
(Change Group)
• -R:递归修改目录及其内部所有文件的所属组
• --reference=ref_file:参照指定文件的属组进行修改
chgrp devgroup file.txt
chgrp -R docker /var/lib/docker
专注于修改组归属的命令。普通用户只有在既是该文件的所有者,同时又是目标组的成员时,才能使用此命令将文件改给自己所在的另一个组;root 则无此限制。现代运维中更多倾向直接使用 chown :groupname 代替。

IO重定向和管道符

重定向

  • 标准 I/O 数据流与 IO 目标
描述符 / 标识 类型 标准文件描述符 (FD) 核心功能与默认流向
stdin 标准输入
(Standard Input)
0 接收程序的数据输入,默认来源于键盘或前置命令的管道输出。
stdout 标准输出
(Standard Output)
1 输出程序的正常执行结果,默认直接打印到终端屏幕。
stderr 标准错误
(Standard Error)
2 输出程序运行时的错误或警告信息,默认独立打印到终端屏幕(不受 1> 重定向影响)。
filename 磁盘文件路径 无 存储数据的物理或虚拟文件,通常作为重定向的目标(如 > filename)或命令处理的对象。

输出重定向

重定向符号
重定向符号 完整/等价语法 操作模式 目标流 (FD) 核心功能与运行机制 实用操作示例
> 1> 覆盖 (Overwrite) 标准输出 (stdout / 1) 将命令的正常输出清空写入到指定文件;若文件不存在则自动创建,若已存在则直接冲掉原有内容。 date > time.txt
ls -l 1> list.txt
>> 1>> 追加 (Append) 标准输出 (stdout / 1) 将命令的正常输出追加到指定文件的末尾;保留原内容,在文件尾部拼接新数据。 echo "new line" >> log.txt
2> 2> 覆盖 (Overwrite) 标准错误 (stderr / 2) 仅将命令产生的错误/警告信息清空写入到指定文件;正常输出依然直接打印到终端屏幕。 find / -name "*.conf" 2> err.log
2>> 2>> 追加 (Append) 标准错误 (stderr / 2) 仅将命令产生的错误/警告信息追加到指定文件的末尾;保留文件原有历史错误日志。 systemctl status nginx 2>> err_history.log
&> > file 2>&1 覆盖 (Overwrite) 全部输出 (1 + 2) 将正常输出和错误信息混合合并后,清空写入到同一个文件中(RHCE/Bash 自动化脚本绝密常用)。 tar -czvf backup.tar.gz /data &> backup.log
&>> >> file 2>&1 追加 (Append) 全部输出 (1 + 2) 将正常输出和错误信息混合合并后,一同追加到同一个文件的末尾。 cron_job.sh &>> /var/log/cron_all.log
拓展:特殊设备
特性 / 维度 /dev/null (空设备 / 黑洞) /dev/zero (零设备 / 数据源)
设备类型 字符设备 (Character Device) 字符设备 (Character Device)
写入行为 (Write) 接收并丢弃所有写入的数据,类似于“垃圾桶”或“数据黑洞”。 接收并丢弃所有写入的数据(与 /dev/null 相同)。
读取行为 (Read) 不提供任何数据,读取时立即返回 EOF (文件结束符)。 持续输出无限的 null 字节 (ASCII 0x00 / \0)。
核心应用场景 屏蔽不需要的命令输出、清空文件内容。 创建固定大小的空文件、初始化磁盘/Swap 分区、性能压测。
用法示例 不输出错误内容:
find /etc -name "*.conf" 2> /dev/null
(在系统中查找文件,将权限不足的路径信息丢弃,仅在屏幕上显示正常找到的路径)
创建指定大小的空文件 (如 1GB 的 Swap 交换文件):
dd if=/dev/zero of=/swapfile bs=1M count=1024
(从零设备提取数据生成 1GB 大小的填充文件)

管道符

管道符 | 用于将前一个命令的标准输出 (stdout / FD 1) 转换为后一个命令的标准输入 (stdin / FD 0)。
通过管道,可以把多个单功能的小工具连接起来,实现复杂的数据处理流水线。

  • 语法格式:
1
command1 | command2 | command3 ...
  • 示例:
1
2
3
4
[root@lab opt]# echo abc | tr 'a-z' 'A-Z'           # 小写转大写
ABC
[root@lab opt]# ifconfig | grep inet6 | grep 64 # 匹配含有关键字的行
inet6 fe80::20c:29ff:fe15:890d prefixlen 64 scopeid 0x20<link>
  • 拓展:三通管道(tee 命令)
1
2
用法: command1 | tee command2 | command3
命令1的标准输出会分别传递到命令2和命令3
  • 示例:将 messages 的内容保存到 log1.txt,然后提取含 error 的行显示在屏幕
1
2
3
[root@lab opt]# cat /var/log/messages | tee log1.txt | grep -i "error"
Jul 19 10:39:25 lab kernel: unchecked MSR access error: RDMSR from 0x852 at rIP: 0xffffffffba87be02 (native_apic_msr_read+0x12/0x50)
...

vim 编辑器

工作模式切换

flowchart TD
    %% 模式节点定义
    Normal["<b>普通模式 (Normal Mode)</b><br><i>默认模式 / 导航与操作</i>"]
    Insert["<b>插入模式 (Insert Mode)</b><br><i>文本输入与修改</i>"]
    Visual["<b>视图模式 (Visual Mode)</b><br><i>文本选择与块操作</i>"]
    Command["<b>底行/命令行模式 (Command-line Mode)</b><br><i>保存、退出、查找与替换</i>"]

    %% 普通模式 -> 其他模式
    Normal -- "<kbd>i</kbd>/<kbd>a</kbd>/<kbd>o</kbd>/<kbd>I</kbd>/<kbd>A</kbd>/<kbd>O</kbd>" --> Insert
    Normal -- "<kbd>v</kbd>/<kbd>V</kbd>/<kbd>Ctrl</kbd>+<kbd>v</kbd>" --> Visual
    Normal -- "<kbd>:</kbd>/<kbd>/</kbd>/<kbd>?</kbd>" --> Command

    %% 其他模式 -> 返回普通模式
    Insert -- "<kbd>Esc</kbd>" --> Normal
    Visual -- "<kbd>Esc</kbd>" --> Normal
    Command -- "<kbd>Esc</kbd>/<kbd>Enter</kbd> (执行后)" --> Normal

    %% 样式美化
    style Normal fill:#2b5c8f,stroke:#4a90e2,stroke-width:2px,color:#fff
    style Insert fill:#2d7d46,stroke:#5cd685,stroke-width:2px,color:#fff
    style Visual fill:#b8621b,stroke:#f39c12,stroke-width:2px,color:#fff
    style Command fill:#6c3483,stroke:#bb8fce,stroke-width:2px,color:#fff
目标模式 从命令模式进入的触发按键 核心功能区别
插入模式 • i / a:在光标前 / 后插入
• I / A:在当前行行首 / 行尾插入br>• o / O:在当前行下方 / 上方新建行并插入
直接键入文本数据。
视图模式 • v:字符选择模式
• V:行选择模式
• Ctrl + v:列/块选择模式(做批量注释、列编辑极度实用)
高亮选中指定文本,后续可配合 y(复制)、d(删除)、c(修改)等命令。
底行模式 • ::执行保存 (:w)、退出 (:q)、替换 (:%s) 等全局指令
• /:向下查找文本
• ?:向上查找文本
(查找模式中用 n / N 在多个关键字之间进行跳转)
在编辑器底部命令行输入拓展指令或正则表达式。

普通模式

分类 快捷键 核心功能与操作机制
光标移动 h / j / k / l 分别对应:左 / 下 / 上 / 右 移动一个字符。
w / b 向后(右)/ 向前(左)移动到下一个单词的词首。
0 / ^ / $ 0 移至行首;^ 移至行首第一个非空字符;$ 移至行尾。
gg / G gg 快速跳转到文件第一行;G 跳转到文件最后一行。
行号 G 或 :行号 跳转到指定的行(例如 15G 跳转到第 15 行)。
Ctrl + f / Ctrl + b 向下(Forward)/ 向上(Backward)翻动一整屏。
文本编辑与删除 x 删除光标所在的当前字符(相当于 Delete)。
dd 删除(剪切)光标所在的整行。支持前缀数字,如 3dd 一次性删除 3 行。
dw / D dw 删除光标所在处至词尾;D 删除光标所在处至当前行尾。
cc / cw 删除整行 / 单词并立即切换至插入模式(Change 操作)。
复制与粘贴 yy 复制光标所在的整行。支持前缀数字,如 5yy 复制 5 行。
yw / y$ yw 复制光标所在处至词尾;y$ 复制光标所在处至行尾。
p / P p 粘贴到光标位置之后/下方;P 粘贴到光标位置之前/上方。
撤销与重做 u 撤销上一次的操作(Undo)。
Ctrl + r 重做撤销掉的操作(Redo)。
. 重复执行上一次的编辑操作(极为实用的重做点命令)。
模式切换 i / a / o 切换至插入模式:i 光标前;a 光标后;o 当前行下方新建行。
v / V / Ctrl + v 切换至视图模式:v 字符选择;V 行选择;Ctrl + v 块/列选择。
: / / : 进入底行命令模式;/ 进入向下查找模式。

插入模式

快捷键 功能分类 功能说明
Ctrl + u 快速删除 清空当前光标至行首的所有内容
Ctrl + w 快速删除 向前删除一个单词
Ctrl + h 快速删除 删除光标前的一个字符
Ctrl + a 文本复用 重复插入上一次插入模式录入的文本
Ctrl + e 文本参照 插入下一行同一列位置的字符
Ctrl + y 文本参照 插入上一行同一列位置的字符
Ctrl + o 模式切换 临时执行一条普通模式命令
Ctrl + n 自动补全 向下匹配补全单词/变量名
Ctrl + p 自动补全 向上匹配补全单词/变量名
Ctrl + x
Ctrl + f
自动补全 自动补全文件名或系统路径
Ctrl + t 格式调整 当前行增加缩进(向右移动)
Ctrl + d 格式调整 当前行减少缩进(向左移动)

命令行模式

分类 快捷指令 / 语法 核心功能与运行机制 实用操作示例
文件保存与退出 :w 保存(写入)当前文件到磁盘。 :w
:q 退出 Vim(若文件有未保存的修改则无法直接退出)。 :q
:wq 或 :x / ZZ 保存修改并退出 Vim(ZZ 在普通模式直接按即可)。 :wq
:q! 强制退出,放弃所有未保存的修改。 :q!
:w filename 将当前内容另存为到指定的 filename 文件。 :w /tmp/backup.txt
行号控制 :set nu 显示行号 (number)。 :set nu
:set nonu 隐藏行号 (nonumber)。 :set nonu
:$ 快速跳转到最后一行的行首。 :$
查找与高亮 /pattern 从光标处向下/向后搜索字符串或正则表达式。 /error
?pattern 从光标处向上/向前搜索字符串或正则表达式。 ?warning
:noh 或 :nohlsearch 取消高亮显示当前搜索选中的匹配结果。 :noh
文本替换 (:s) :[range]s/old/new/[flags] 在指定范围内进行文本查找与替换。 (见下方示例)
• 当前行替换 替换当前光标所在行的第一个匹配项。 :s/foo/bar/
• 当前行全局替换 替换当前光标所在行的所有匹配项 (g flag)。 :s/foo/bar/g
• 全文替换 替换整个文件(% 表示全文)中的所有匹配项。 :%s/foo/bar/g
• 带确认提示替换 替换全文并逐个交互询问确认 (c flag: confirm)。 :%s/foo/bar/gc
• 指定行范围替换 仅在指定行号范围内(如 10 到 20 行)进行替换。 :10,20s/foo/bar/g
外部系统交互 :!command 不退出 Vim 的情况下执行指定的 Bash 系统命令。 :!ls -l /etc
:r filename 读取并导入指定文件的内容,插入到当前光标所在行下方。 :r /etc/hosts
:r !command 将系统命令的标准输出直接插入到当前文件光标下方。 :r !date
多文件与环境配置 :e filename 在当前窗口直接打开并编辑另一个文件。 :e /etc/fstab
:set ignorecase 设置搜索时忽略大小写(简写 :set ic)。 :set ic
:set paste 开启粘贴模式,防止从外部复制带缩进的代码时样式混乱。 :set paste

可视化模式(仅作了解)

分类 快捷键 核心功能与操作机制 实用操作示例
进入模式 v 字符可视模式 (Visual Character Mode):按字符递进选择文本。 适合精准选中一小段文本或单个单词。
V 行可视模式 (Visual Line Mode):按整行递进选择文本。 适合快速选中多行代码或段落。
Ctrl + v 块可视模式 (Visual Block Mode):按矩形列/块选择文本。 常用于批量添加/删除注释。
范围调整 h / j / k / l 使用方向键或导航键扩展/缩减当前高亮选区。 配合 w、$、G 等快捷键可实现快速大范围选中。
o 切换选区光标端点:将光标在大高亮块的“起始端”和“结尾端”之间移动。 选中大段区域后,若想微调起始位置,无需取消重新选,按 o 即可切回起点调整。
选区操作 d 或 x 剪切/删除:删除所有高亮选中的文本(并存入剪切板)。 选中指定多行或选区后直接按 d 即可清空。
y 复制:复制所有高亮选中的文本(拷贝到剪切板)。 选中后按 y,移动光标到目标位置按 p 粘贴。
c 修改:删除选中文本并直接进入插入模式。 适合替换高亮选中的任意不规则区域。
> / < 缩进调整:将选中的整行文本向右缩进(>)或向左缩进(<)。 整理代码或脚本格式时,选中多行按 > 快速缩进。
u / U 大小写转换:将选区内的文本全部转为小写(u)或大写(U)。 批量修改变量或常量命名格式。
: 对选区执行底行指令:按 : 后,底部会自动出现 :'<,'> 前缀。 :'<,'>s/old/new/g
(仅在选中的文本范围内执行查找替换)

文本处理工具

文本查看工具

命令 核心特性与合并使用场景 常用快捷键与交互 实用操作示例
cat 小文件快速查看与多文件拼接
• 一次性将文件全部内容加载并输出到终端屏幕,适合内容简短的文件。
• 支持配合重定向符号(> / >>)高效合并或拼接多个文件。
• 优势:简单直接,方便管道传输与文件合并;不占用交互终端。
无交互(直接一次性输出)。 • cat /etc/hosts
(查看小文件)
• cat -n file.txt
(带行号显示)
• cat a.txt b.txt > all.txt
(合并多文件)
more 中大型文件基础分页浏览
• 按页/按行加载并显示文本,解决大文件刷屏问题,适合一次性从头读到尾的场景。
• 优势:相比 cat 可控制阅读节奏;资源占用低,传统 UNIX 环境兼容性极佳。
• Space:向下翻一页
• Enter:向下翻一行
• b:向上翻一页
• q:退出查看
• /string:向下查找
• more /var/log/syslog
(基础分页查看日志)
• ls -l /etc | more
(配合管道分页输出)
less 海量日志与超大文件高效交互检视(运维首选)
• 按需延迟加载:不论文件多大(如 10GB+)均可瞬间打开,极省内存。
• 支持完整 Vim 风格的前后自由滚屏、高亮搜索、跳转与实时监听。
• 优势:性能极强,检索体验极佳,不会卡死终端。
• f / Space:向下翻页
• b:向上翻页
• g / G:跳至文件首 / 尾
• /pattern:向下查找
• ?pattern:向上查找
• n / N:跳转匹配项
• F:实时监听追加(同 tail -f)
• less /var/log/messages
(高效检索海量日志)
• less -N /etc/passwd
(带行号交互查看)
head 文件头部预览与格式校验
• 仅提取并显示文本开头的若干行(默认前 10 行)。
• 适合快速确认 CSV/日志的文件表头、配置开头或数据格式。
• 优势:执行极快,无需读取整个文件即可完成首部采样。
无交互。 • head -n 5 /etc/passwd
(查看文件前 5 行)
• head -c 100 file.txt
(查看文件前 100 字节)
tail 文件尾部查看与实时日志监控(排错神器)
• 默认显示文本最后 10 行;配合 -f / -F 参数可实现动态实时监听。
• 运维排查服务报错、跟踪系统/应用实时写入日志的必备命令。
• 优势:精准定位最新数据,无需刷新即可实时抓取新增日志。
在 -f 实时监听状态下:Ctrl + c 退出监听。 • tail -n 20 /var/log/nginx/error.log
(查看最后 20 行)
• tail -f /var/log/nginx/access.log
(动态实时监听新增日志)

过滤行工具 grep

基于正则表达式从文本中快速匹配并过滤出特定内容。

  • grep 用法
分类 / 维度 命令参数 / 语法 核心功能与运行机制 实用操作示例
基础文本检索 grep "pattern" file 从指定文件中逐行匹配并打印包含模式(pattern)的行。 grep "root" /etc/passwd
大小写控制 -i 忽略大小写(Ignore case),匹配时不区分大写和小写字母。 grep -i "error" /var/log/messages
显示匹配行号 -n 显示行号(Line number),在输出的每一行前附加其在原文件中的行号。 grep -n "Failed password" /var/log/secure
统计匹配数量 -c 计数模式(Count),不显示匹配的具体文本,仅输出匹配到的总行数。 grep -c "GET /index.html" /var/log/nginx/access.log
递归目录检索 -r / -R 递归目录(Recursive),深入指定目录及其所有子目录下递归检索文件。 grep -rn "HOSTNAME" /etc/sysconfig/
匹配上下文关联 -A, -B, -C 打印匹配行的上下文文本:
• -A n:同时打印匹配行之后(After)的 n 行
• -B n:同时打印匹配行之前(Before)的 n 行
• -C n:同时打印匹配行前后(Context)各 n 行
grep -A 5 -B 2 "Exception" app.log
(输出报错行以及前 2 行和后 5 行的详细堆栈信息)
正则表达式拓展 -E (等价于 egrep) 扩展正则表达式(Extended Regex),支持 ` (或)、+ (一次或多次)、?` (零次或一次) 等高级语法。
  • 搭配正则表达式
正则类型 语法 / 元字符 匹配逻辑与含义 实用 grep 命令示例 匹配结果/说明
位置锚定 ^ 匹配行首的位置。 grep "^root" /etc/passwd 匹配所有以 root 开头的行。
$ 匹配行尾的位置。 grep "bash$" /etc/passwd 匹配所有以 bash 结尾的行(查看默认 Shell 为 bash 的用户)。
^$ 匹配空白行(零字符行)。 grep -v "^$" /etc/sysctl.conf 匹配文件中的所有空行。
\< 或 \b 匹配词首(单词左边界)。 grep "\<log" /var/log/messages 匹配以 log 开头的单词(如 login、logout,但不匹配 blog)。
\> 或 \b 匹配词尾(单词右边界)。 grep "log\>" /var/log/messages 匹配以 log 结尾的单词(如 blog、syslog,但不匹配 logging)。
字符匹配 . 匹配除换行符外的任意单个字符。 grep "r..t" /etc/passwd 匹配 root、roat、r12t 等字符序列。
[...] 匹配方括号内的任意单个字符。 grep "[a-z]01" file.txt 匹配 a01、b01 等(字母 + 01)。
[^...] 匹配不在方括号内的任意单个字符(取反)。 grep "[^0-9]123" file.txt 匹配非数字开头的 123(如 a123,不匹配 0123)。
基础重复
(BRE)
* 匹配前面的字符出现 0 次或多次。 grep "go*d" file.txt 匹配 gd、god、good、gooood 等。
.* 匹配任意长度的任意字符(贪婪匹配)。 grep "Ip.*127" /etc/hosts 匹配行内包含 Ip 且后续有 127 的任意行。
\{n,m\} 匹配前面的字符出现 n 到 m 次。 grep "a\{2,4\}" file.txt 匹配连续出现 2 到 4 次的字母 a(如 aa、aaa、aaaa)。
扩展重复
(ERE, 需 -E)
+ 匹配前面的字符出现 1 次或多次(至少 1 次)。 grep -E "go+d" file.txt 匹配 god、good(不匹配 gd)。
? 匹配前面的字符出现 0 次或 1 次(可选)。 grep -E "https?" urls.txt 同时匹配 http 和 https。
{n,m} 匹配前面的字符出现 n 到 m 次(无需转义)。 grep -E "a{2,4}" file.txt 同 BRE 逻辑,语法更简洁清晰。
逻辑与分组
(ERE, 需 -E)
| 逻辑或(Or),匹配分隔的多个模式之一。 grep -E "error|warning|fatal" app.log 同时匹配包含 error、warning 或 fatal 的行。
( ... ) 文本分组,把括号内的模式当作一个整体处理。 grep -E "(ip){2}" file.txt 匹配连续出现两次 ip 的单词(如 ipip)。
字符集合预定义
(POSIX 类)
[[:digit:]] 匹配任何阿拉伯数字(等价于 [0-9])。 grep "[[:digit:]]" file.txt 查找所有包含数字的行。
[[:alpha:]] 匹配任何大小写字母(等价于 [a-zA-Z])。 grep -E "^[[:alpha:]]+" file.txt 匹配以纯字母开头的行。
[[:alnum:]] 匹配字母和数字(等价于 [a-zA-Z0-9])。 grep -v "[[:alnum:]]" file.txt 匹配包含特殊符号或纯空格的行。
[[:space:]] 匹配任何空白字符(空格、Tab 制表符等)。 grep -E "[[:space:]]+$" file.txt 排错高频:检测并显示行尾带有残留多余空格/Tab的行。

文本截取工具 cut

按指定分隔符或字符位置切割并提取文本的特定列。

参数 / 维度 语法格式 核心功能与运行机制 实用操作示例
按分隔符提取列 -d "CHAR" -f N 最强高频用法。-d 指定列分隔符(默认是 Tab 制表符),-f 指定提取第 N 列(多列用逗号隔开,范围用连字符 -)。 cut -d ":" -f 1,6 /etc/passwd
(提取 /etc/passwd 中的用户名第 1 列和家目录第 6 列)
提取指定列范围 -f N-M 连续提取第 N 列到第 M 列的内容;-f N- 表示从第 N 列到行尾;-f -M 表示从开头到第 M 列。 cut -d ":" -f 1-3 /etc/passwd
(提取第 1 到第 3 列)
cut -d ":" -f 3- /etc/passwd
(提取第 3 列及之后的所有列)
按字符位置提取 -c N-M 按固定字符数(Characters)切割。提取每一行指定位置或范围的字符,不受分隔符影响。 cut -c 1-5 /etc/passwd
(提取每行前 5 个字符)
cut -c 1,3,5 file.txt
(仅提取第 1、3、5 个字符)
按字节位置提取 -b N-M 按字节数(Bytes)切割。在纯 ASCII 文本中与 -c 效果相同,常配合 -n 参数避免打断多字节字符(如中文)。 cut -b 1-10 file.txt
(提取每行前 10 个字节)

文本分析工具 sort uniq wc

  • sort 排序工具
    对文本行按字母、数值或特定列进行排序。
选项 核心功能与运行机制 实用操作示例
-n 按数值大小(Numeric)排序(默认按 ASCII/字符排序,如 10 会被排在 2 前面,加 -n 可正确识别数字)。 cat num.txt | sort -n
-r 逆序/降序(Reverse)排列(从大到小或 Z-A)。 cat names.txt | sort -r
-k N 按指定列(Key)排序。配合 -t 指定分隔符,可按特定列的内容进行排序。 sort -t ":" -k 3 -n /etc/passwd
(按 UID/第 3 列数值大小正序排列)
-u 排序并去重(Unique)。在排序的同时删除重复行(效果等同于 sort | uniq)。 sort -u data.txt
-h 按人类可读单位(Human-numeric)排序(正确识别 2K, 5M, 1G 等容量大小)。 du -sh * | sort -rh
(将当前目录下的文件/文件夹按占用空间降序排列)
  • uniq 去重工具
    去除或统计文本中连续相邻的重复行(常配合 sort 使用)。
选项 核心功能与运行机制 实用操作示例
(无参数) 相邻行去重。关键前提:uniq 只去除连续相邻的重复行,使用前必须先用 sort 排序! cat log.txt | sort | uniq
-c 统计重复次数(Count)。在每一行前显示该行出现的总次数(运维频次统计核心参数)。 cat access.log | awk '{print $1}' | sort | uniq -c | sort -rn
(统计访问 IP 频次并按降序输出)
-d 仅显示重复行(Repeated)。只输出在文件中出现两次或以上的行。 cat list.txt | sort | uniq -d
(找出所有重复的数据)
-u 仅显示唯一行(Unique)。只输出在文件中仅出现过一次的行。 cat list.txt | sort | uniq -u
(过滤出完全无重复的数据)
-i 忽略大小写(Ignore case)。去重比较时忽略字母大小写差异。 cat words.txt | sort | uniq -ic
  • wc 统计工具
    去除或统计文本中连续相邻的重复行(常配合 sort 使用)。
选项 核心功能与运行机制 实用操作示例
-l 统计总行数(Lines)。统计文本的行数或管道传来的结果行数(高频使用)。 ls -1 /etc | wc -l
(统计 /etc 目录下的文件/子目录数量)
-w 统计单词数(Words)。按空白字符分隔统计文本中的单词数量。 wc -w article.txt
-c 统计字节数(Bytes)。统计文件或文本占用的字节总数。 wc -c file.txt
-m 统计字符数(Chars)。统计文件中的字符总数(在 UTF-8 中文环境下与 -c 字节数不同)。 wc -m chinese.txt

文本对比工具 diff

  • diff 不建议直接使用,一般是简单判断文件是否被修改了
  • vimdiff 带有颜色高亮的比较工具,会进入到vim编辑器中

文本编辑工具 sed

sed(Stream Editor,流编辑器)是一种非交互式的文本处理工具。
它按行读取文本,并将数据放入临时缓冲区(模式空间)中,依据指定的规则进行文本匹配、替换、删除、插入或打印,处理完成后将结果输出到屏幕,默认不会直接修改原文件。
sed 的核心优势在于高效的自动批处理和强大的正则替换,常用于 Shell 脚本中对配置文件的自动化修改与文本清洗。

graph TD
    Input["待处理的主文件 / 数据流"]
    PS["模式空间 (Pattern Space)<br>┌──────────────────────────┐<br>│  当前读入的单行文本工作台 │<br>└──────────────────────────┘"]
    
    OptionCheck{"是否使用了 -i 参数?<br>(In-place 原地修改)"}
    FileOut["写回 / 覆盖 原文件<br>(或生成 .bak 备份文件)"]
    Output["终端屏幕 / 输出管道<br>(标准输出 stdout)"]

    %% 1. 读取
    Input -->|"1. 逐行读取 (Read Line)"| PS
    
    %% 2. 内部处理 (自己指向自己)
    PS -->|"2. 执行 sed 指令 (如 s/a/b/g, d, p)<br>直接在内存工作台上修改文本"| PS
    
    %% 3. 处理完毕判定输出
    PS -->|"3. 本行处理完毕,准备输出"| OptionCheck
    
    OptionCheck -->|"是 (使用了 -i)"| FileOut
    OptionCheck -->|"否 (默认不加 -i)"| Output
  • sed 命令的整体组成

sed 命令的基本语法格式为:sed [选项] '地址定界 处理动作' 文件名

组成部分 常见参数 / 元素 核心作用与功能描述
全局选项 (Options) -n 取消默认输出:只打印经 p 指令显式指定的处理结果。
-i 直接修改原文件:不在终端仅做预览,直接将结果写入文件。
-e 多点编辑:允许在单条命令中指定多个 地址 动作 表达式。
-r / -E 启用扩展正则:支持 +、?、|、() 等高级正则符号而无需转义。
地址定界 (Address) 数字 / 正则 / 范围 指定操作对象:定义处理动作作用于文本的哪些行(若省略则默认匹配所有行)。
处理动作 (Command) p / d / s / a / i / c 指定具体操作:决定对选中的行执行何种编辑逻辑(如替换、删除、追加等)。
  • 地址定界 (Address)

地址定界用于筛选出需要执行动作的目标行:

定界方式 语法格式 说明与示例
单行匹配 N 精准指定行号
例如 sed -n '5p' file.txt (仅处理第 5 行)
$ 代表最后一行
例如 sed -n '$p' file.txt (仅处理最后一行)
/pattern/ 正则匹配单行
例如 sed -n '/error/p' file.txt (仅处理包含 error 的行)
行号范围 N,M 指定起始到结束行
例如 sed -n '3,8p' file.txt (处理第 3 至第 8 行)
N,+M 起始行及后续 M 行
例如 sed -n '3,+5p' file.txt (处理第 3 行以及随后的 5 行,即 3-8 行)
正则范围 /pat1/,/pat2/ 模式匹配起始与结束
例如 sed -n '/BEGIN/,/END/p' file.txt (从匹配 pat1 的行开始,一直处理到匹配 pat2 的行)
步长匹配 N~M 指定起始行与递增步长
例如 sed -n '1~2p' file.txt (从第 1 行开始,每隔 2 行打印一次,即打印所有奇数行)
逻辑取反 地址! 对地址条件取反
例如 sed -n '1,5!p' file.txt (打印除了 1 到 5 行之外的所有行)
  • 处理动作 (Command)

配合地址定界对选中的文本行执行具体的编辑操作:

动作符号 动作名称 核心功能与使用说明 实用示例
p Print
(打印)
打印当前模式空间的内容。通常与全局选项 -n 搭配使用。 sed -n '1,3p' file.txt
d Delete
(删除)
删除模式空间中匹配的行,停止后续动作并立即读取下一行。 sed '/^#/d' file.txt
s Substitute
(替换)
查找并替换文本。
基本语法:s/源文本/目标文本/修饰符
常用修饰符:g
(全局替换)、i
(忽略大小写)。
sed 's/root/admin/g' file.txt
a Append
(行后追加)
在匹配到的目标行下方追加一行或多行指定文本。 sed '/IP/a GATEWAY=192.168.1.1' file.txt
i Insert
(行前插入)
在匹配到的目标行上方插入一行或多行指定文本。 sed '1i # Author: RedHat' file.txt
c Change
(整行替换)
将匹配到的整行文本直接替换为新的内容。 sed '3c SELINUX=disabled' file.txt
r Read
(读取导入)
读取指定外部文件的内容,并插入到匹配行的下方。 sed '/header/r /tmp/notice.txt' file.txt
w Write
(另存写入)
将匹配到的行写入并保存到指定的外部文件中。 sed -n '/error/w /tmp/error.log' app.log

文本转换工具 tr

tr(Translate)是一个轻量高效的字符转换工具,专门从标准输入中读取文本,用于对字符进行替换、删除、去重和大小写转换。

分类 / 维度 命令参数 / 语法 核心功能与运行机制 实用操作示例
标准字符替换 tr "SET1" "SET2" 一一对应替换。将输入中所有属于 SET1 的字符,对应替换为 SET2 中同位置的字符。 echo "hello world" | tr "a-z" "A-Z"
(将小写字母全部转为大写)
删除字符 -d "SET" 按字符删除(Delete)。从文本中直接删除所有属于 SET 集合中的字符。 cat file.txt | tr -d "\r"
(去除 Windows 换行符 \r,转换为 Linux 格式)
压缩去重 -s "SET" 连续字符挤压去重(Squeeze)。将连续重复出现的同类字符(如多个连续空格)压缩为一个。 df -h | tr -s ' '
(将多个连续空格压缩为单个空格,便于后续 cut 切割)
集合取反 -c / -C 补集匹配(Complement)。针对 SET1 的补集(即不属于 SET1 的所有其他字符)进行操作。 echo "abc 123 !@#" | tr -cd "[:digit:]\n"
(保留数字和换行符,删除所有非数字字符)

Bash/变量/别名

Bash Shell

Shell 是 Linux 操作系统的命令行交互界面与脚本解释器,充当用户与内核之间的桥梁,负责接收指令并调动系统资源执行。

flowchart TD
    subgraph UserSpace ["用户 (最外层)"]
        style UserSpace fill:#ffffff,stroke:#333333,stroke-width:2px
        
        Cmd["<b>命令</b>"]
        
        subgraph ShellSpace ["Shell (中间层)"]
            style ShellSpace fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
            
            Parse["<b>解析命令并传递给内核</b>"]
            
            subgraph KernelSpace ["Kernel (最内层)"]
                style KernelSpace fill:#bbdefb,stroke:#0d47a1,stroke-width:2px
                
                Exec["<b>执行动作</b>"]
            end
        end
    end

    Cmd -- "发起" --> Parse
    Parse -- "下发" --> Exec

Bash 的快捷键

分类 / 场景 快捷键 核心功能与操作机制 实用场景示例
光标快速移动 Ctrl + a 将光标快速跳至当前命令行的行首。 输入长命令后想在最前面加 sudo。
Ctrl + e 将光标快速跳至当前命令行的行尾。 在长命令末尾继续追加参数。
Alt + b 将光标向左(向后)移动一个完整单词。 快速跨单词微调参数。
Alt + f 将光标向右(向前)移动一个完整单词。 快速向右跨单词定位。
文本快速编辑 Ctrl + u 剪切/删除光标位置至行首的所有字符。 输错半条指令时迅速清空左侧文本。
Ctrl + k 剪切/删除光标位置至行尾的所有字符。 删掉光标右侧多余的路径或参数。
Ctrl + w 剪切/删除光标左侧的一个单词(按空格分隔)。 快速撤销上一个输入的参数或路径。
Ctrl + y 粘贴最近一次由 Ctrl+u/k/w 剪切的文本。 将剪切的内容重新粘贴到新位置。
Ctrl + h 删除光标左侧的一个字符(等价于 Backspace)。 快捷删除单个字符。
命令历史与搜索 Ctrl + r 反向递进检索历史命令:输入关键词即可匹配历史记录。 快速调出极长的历史命令(连续按 Ctrl+r 可向上匹配更早的记录)。
Ctrl + g 退出 Ctrl+r 历史检索状态,恢复当前命令行。 放弃搜索并返回正常输入状态。
Alt + . 自动提取并插入上一条命令的最后一个参数。 执行 mkdir test_dir 后,紧接着输入 cd 并按 Alt+. 自动填入 test_dir。
控制与进程管理 Ctrl + c 终止当前进程(发送 SIGINT 信号),强行打断命令运行。 中断死循环脚本或卡住的命令。
Ctrl + z 挂起当前进程(发送 SIGTSTP 信号),将任务推入后台暂停。 暂停编辑临时切回 Shell(后续输入 fg 恢复)。
Ctrl + d 发送 EOF(文件结束符),在空行时等价于退出当前 Shell 终端(exit)。 快速注销 SSH 或退出子 Shell。
Ctrl + l 清屏(清空终端屏显),等价于执行 clear 命令。 屏幕太乱时快速刷新界面(原输入命令不受影响)。
Ctrl + s / Ctrl + q Ctrl+s 冻结终端屏幕输出;Ctrl+q 解冻恢复输出。 滚动大量日志时临时卡住屏幕查看内容。

通配符与扩展符号

符号 / 分类 语法类型 核心功能与运行机制 实用操作示例
通配符
(Pathname Expansion)
* 匹配零个或任意多个任意字符。 ls *.conf
(查找所有以 .conf 结尾的文件)
? 匹配恰好一个任意字符。 ls file?.txt
(匹配 file1.txt、fileA.txt,不匹配 file12.txt)
[...] 匹配括号内指定的任意单个字符。 ls log[123].txt
(匹配 log1.txt、log2.txt 或 log3.txt)
ls [a-z]*.sh
(匹配以小写字母开头的脚本)
[^...] 或 [!...] 匹配不在括号内的任意单个字符(取反)。 ls file[^0-9].txt
(匹配第三个字符非数字的文件,如 fileA.txt)
{...} 匹配花括号中以逗号分隔的任意字符串组合。 ls *.{png,jpg,jpeg}
(同时查找 png、jpg、jpeg 格式图片)
花括号扩展
(Brace Expansion)
{A,B,C} 字符串组合生成/生成序列,无需文件存在即可生成列表。 mkdir -p project/{src,bin,doc}
(一次性创建 src、bin、doc 三个目录)
{N..M} 生成连续的数字或字母序列(支持指定步长 {N..M..step})。 touch file{1..5}.txt
(批量创建 file1 到 file5)
echo {a..z}
(生成 26 个小写字母)
命令替换
(Command Substitution)
$(command) 执行命令并将输出替换回原位置(现代推荐标准语法)。 tar -zcvf log-$(date +%Y%m%m).tar.gz /var/log
算术扩展
(Arithmetic Expansion)
$((expression)) 计算整型算术表达式并输出结果。 echo $(( 10 + 5 * 2 ))
(输出 20)
NUM=$((NUM + 1))
变量扩展
(Parameter Expansion)
$VAR / ${VAR} 引用/替换变量的值;带 ${} 可防止变量名与后续字符混淆。 PREFIX="app"
echo "${PREFIX}_data"
(精准识别变量 PREFIX)
${VAR:-default} 默认值设置:若变量未设置或为空,则返回默认值。 echo "${PORT:-8080}"
(若 PORT 未赋值则使用 8080)

变量

变量本质上是一个用于存储和指向数据的“有名字的内存容器”。

简单来说,变量就像是一个贴了标签的盒子:

  • 变量名(标签):你给这个盒子起的名字(例如 AGE 或 PATH),用来在后续代码中引用它。
  • 变量值(盒子里装的内容):存放在里面的具体数据(例如数字 25、文本 “root“ 或一个系统路径)。

本地变量与环境变量的区别

  • 本地变量仅在当前 Shell 进程有效。子 Shell 或新打开的终端无法访问该变量。
  • 环境变量对当前 Shell 及其所有子进程均有效。常用于传递系统配置信息。
graph TB
    %% Shell 进程 (包含子进程)
    subgraph ParentShell ["父 Shell 进程 (当前终端)"]
        style ParentShell fill:#f5f5f5,stroke:#616161,stroke-width:2px
        
        VAR1["<b>本地变量</b><br/>VAR1='local'"]
        VAR2["<b>环境变量</b><br/>export VAR2='env'"]

        %% 嵌套在父 Shell 内部的子 Shell 进程
        subgraph ChildShell ["子 Shell 进程"]
            style ChildShell fill:#e1f5fe,stroke:#0288d1,stroke-width:2px
            
            C_VAR1["❌ 无法获取 VAR1<br/><i>(未定义 / 为空)</i>"]
            C_VAR2["✅ 继承 VAR2<br/><i>(值为 'env')</i>"]
        end
    end

    %% 独立 Shell 进程 (完全隔离)
    subgraph OtherShell ["其它 Shell 进程"]
        style ParentShell fill:#f5f5f5,stroke:#616161,stroke-width:2px
        
        O_VAR1["❌ 无法获取 VAR1"]
        O_VAR2["❌ 无法获取 VAR2"]
    end

    %% 变量传递逻辑
    VAR1 -- "无法跨越<br/>(仅限当前进程)" --> C_VAR1
    VAR2 == "单向向下传递<br/>(继承环境变量副本)" ==> C_VAR2

    %% 独立进程隔离说明
    ParentShell -.- O_VAR1

定义、查看、引用变量

分类 快捷键 / 命令 核心功能与运行机制 实用操作示例
变量定义 NAME=value 定义局部自定义变量。在当前 Shell 进程内创建或修改变量(注意:= 两侧绝对不能有空格)。 IP="192.168.1.100"
PORT=8080
export NAME=value
或 export NAME
定义/提升为环境变量。将变量导出为全局环境变量,使其对当前 Shell 的所有子进程生效。 export PATH=$PATH:/usr/local/bin
export NODE_ENV="production"
read 交互式读取变量。接受用户键盘输入或标准输入,并将值赋给指定变量。
• -p:指定提示信息
• -s:隐式输入(如密码)
read -p "请输入用户名: " USERNAME
read -sp "请输入密码: " PASSWD
变量查看 echo $NAME 打印单个变量的值。最常用的变量提取查看命令。 echo $IP
echo ${PORT}
set 查看当前终端的所有变量。显示当前 Shell 环境中定义的所有变量(包含局部自定义变量、环境变量和函数)。 set | grep "IP="
set | head -n 20
env / printenv 查看当前所有环境变量。仅显示从导出并传递给子进程的环境变量(不包含普通局部变量)。 env
printenv PATH
(直接查看指定环境变量)
declare -p [NAME] 查看变量的属性和完整定义结构。显示变量的类型声明(如是否只读、是否数组)及精确赋值。 declare -p PATH
declare -p SUM
变量引用 $NAME 标准简单引用。提取并替换变量的值。 echo $IP
${NAME} 精确边界界定引用(最推荐标准写法)。明确变量名的边界,防止变量名与紧随其后的文本相粘连造成歧义。 PREFIX="app"
echo "${PREFIX}_service"
(若写成 $PREFIX_service 会被识别为变量 $PREFIX_service)
${NAME:-default} 高级条件引用(默认值备选)。若变量未定义或为空,则临时返回 default,但变量本身值不改变。 echo "${TIMEOUT:-30}"
(若 TIMEOUT 未设置,则使用 30)

特殊的环境变量:系统变量

系统变量(通常表现为全局环境变量)是操作系统或操作系统下的 Shell 预先定义好的一套“通用配置项”。它们就像系统的全局“环境设置”,用来保存当前登录用户、操作系统环境、硬件平台以及程序运行所需的基础路径与语言偏好等关键信息。

常见的系统变量

系统变量名 核心功能与运行机制 默认典型值示例 实用操作 / 排错场景示例
PATH 可执行命令的搜索路径列表。
当你在终端输入一个命令(如 ls 或 python)时,系统会按照 PATH 中由冒号 : 分隔的目录顺序依次寻找对应的可执行文件,找到即止。
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 自定义软件配置:
export PATH=$PATH:/opt/bin
(将 /opt/bin 加入全局搜索路径,无需输入绝对路径即可直接运行该目录下的工具)
HOME 当前登录用户的家目录(主目录)绝对路径。
执行 cd(不加参数)或 cd ~ 时,Shell 会读取此变量跳转到对应的用户目录。
• 普通用户:/home/username
• root 用户:/root
脚本通用路径定位:
cp config.json $HOME/.config/
(编写通用脚本时,将配置文件精准放至当前用户的家目录下)
USER 当前登录用户的用户名。
记录当前正在操作终端或运行当前进程的账户标识。
root 或 zhangsan 脚本权限校验:
if [ "$USER" != "root" ]; then
  echo "必须使用 root 权限运行!"
fi
SHELL 当前用户默认使用的 Shell 解释器绝对路径。
系统在用户登录时读取此变量,为其分配指定的交互式命令行环境。
/bin/bash 或 /bin/zsh 查看与兼容判断:
echo $SHELL
(快速确认当前使用的是 Bash、Zsh 还是其他 Shell)
TMP / TEMP 临时文件存放目录。
许多程序或脚本在运行过程中需要创建临时中间文件时,会优先读取此变量指向的路径。
/tmp 或 /var/tmp 清洗/存取临时数据:
echo "data" > $TMP/test.tmp
(Linux 环境下若未显式定义 TMP,程序通常默认回退使用 /tmp 目录)
LANG / LC_ALL 系统区域设置与语言/编码环境。
• LANG:设定系统的默认语言、地区和字符集编码(如 UTF-8)。
• LC_ALL:最高优先级重写变量,一旦设置会无视并覆盖所有 LANG 及其他 LC_* 细节配置。
zh_CN.UTF-8 或 en_US.UTF-8 解决乱码/强制英文输出:
LANG=en_US.UTF-8 log_tool
(排错时临时将输出语言切换为英文,方便检索报错信息)

永久定义变量

在 Linux 中,直接在命令行中使用 export VAR=value 定义的变量仅在当前终端会话中有效,关闭终端或重启系统后就会失效。

要实现永久定义,必须将变量定义写入到系统或用户的 Shell 启动配置文件 中。当 Shell 启动时,会自动读取这些文件并加载变量。

作用范围 适用场景 目标配置文件 特点与生效方式
全员/系统级 对系统上的所有用户及所有 Shell 进程均生效。 /etc/profile
或 /etc/profile.d/*.sh(推荐)
需要 root 权限。推荐在 /etc/profile.d/ 下新建独立的 .sh 脚本,便于管理和维护。
单用户级 仅对当前特定用户生效。 ~/.bashrc
或 ~/.bash_profile
无需 root 权限,修改仅作用于当前用户的家目录。

别名

alias(别名)是 Shell 内置的核心功能,用于将一条较长的、复杂的或带有特定参数的命令映射为一个简短的名称,从而提高命令行操作效率,避免重复输入长命令。

分类 / 维度 语法格式 核心功能与运行机制 实用操作示例
定义别名 alias 别名='原命令' 创建临时别名。在当前 Shell 进程中为原命令指定新名称(注意:等号两侧绝对不能有空格,建议用单引号包裹原命令)。 alias ll='ls -alF'
alias c='clear'
查看别名 alias 显示当前所有别名。不带任何参数时,列出当前 Shell 环境中生效的所有别名映射。 alias
alias ll
(查看特定别名 ll 的具体定义)
取消别名 unalias 别名 移除指定别名。从当前 Shell 环境中删除指定的别名定义(-a 参数可清空所有别名)。 unalias ll
unalias -a
(取消所有别名)
绕过别名执行 \命令 或 command 命令 强制执行原命令。忽略已定义的别名,直接调用系统的原生二进制文件/内置指令。 \cp -rf dir1 dir2
(绕过 cp -i 的覆盖提示,直接强制覆盖)

在命令行中直接执行 alias 定义的别名仅在当前终端窗口有效,关闭终端后即消失。要让别名永久生效,需将其写入配置文件 ~/.bashrc 或 /etc/profile.d/*.sh 中。

  • 转义字符:去掉字符的特殊意义
    符号 / 分类 语法/机制名称 核心功能与运行机制 实用操作示例
    \ 反斜杠 (Backslash)
    (强转义单个字符)
    移除紧随其后单个字符的特殊含义,使其降级为普通字符(字面量);在行尾时作为续行符使用。 • echo \$VAR
    (输出文本 $VAR,阻止变量扩展)
    • touch file\ name.txt
    (将空格转义,创建带空格的文件名)
    • echo "hello \
      world" (跨行拼接长命令)
    "" 双引号 (Double Quotes)
    (弱引用 / 局部转义)
    保留大部分字符的字面量,但允许某些特殊符号继续生效并被解析。
    • 允许生效的符号:$(变量/算术扩展)、\(转义)、!(历史命令)、` `(命令替换)。
    • NAME="Linux"
      echo "Hello $NAME"
    (输出 Hello Linux)
    • echo "Cost: \$100"
    (配合 \ 转义美元符号,输出 Cost: $100)
    '' 单引号 (Single Quotes)
    (强引用 / 完全屏蔽)
    彻底关闭所有字符的特殊含义,括号内所有内容一律按纯文本原样处理(没有任何符号能逃过单引号的屏蔽,甚至连 \ 在单引号内部也只代表普通的反斜杠字符)。 • NAME="Linux"
      echo 'Hello $NAME'
    (输出文本 Hello $NAME)
    • echo 'a\nb $1'
    (原样输出 a\nb $1)

系统的进程管理

进程概述

  • 进程(Process)
    进程是操作系统中正在运行的一个程序的实例。它不仅包含程序的代码,还拥有独立的内存空间、系统资源(如打开的文件描述符、网络端口)以及 CPU 执行状态。程序本身只是存放在磁盘上的静态文件,只有被装载到内存中并由 CPU 执行时,才成为了动态的进程。

  • 父进程(Parent Process)
    在 Linux/Unix 系统中,除了系统启动时的初始进程外,所有新进程都是由已存在的进程创建出来的。那个发起创建指令、生成新进程的原始进程就是父进程。父进程负责管理子进程的生命周期,并在子进程结束时收集其退出状态信息。

  • 子进程(Child Process)
    由父进程通过系统调用(如 fork())派生或创建出来的新进程就是子进程。子进程在刚创建时会继承父进程的大部分环境属性(如环境变量、当前工作目录、打开的文件等),但它拥有自己独立的内存空间和唯一的进程标识符。

  • 进程标识符(Process ID / PID)
    进程 ID 是操作系统为每一个运行中的进程分配的唯一数字编号。系统使用 PID 来精准识别、追踪和管理特定的进程。你可以通过 PID 向指定进程发送信号(例如使用 kill <PID> 来终止某个进程)。

  • PID 1(初始进程 / Init Process)
    PID 1 是 Linux 系统内核启动后创建的第一个用户态进程(在现代 Linux 系统中通常是 systemd)。它是系统中所有其他进程的“老祖宗”或终极父进程。PID 1 承担着初始化系统服务、管理系统状态以及回收无人管辖的“孤儿进程”等关键职责。

  • 权限继承(Permission Inheritance)
    当父进程创建子进程时,子进程默认会继承父进程的安全上下文与访问权限,包括运行该进程的用户身份(UID)、所属用户组(GID)以及文件创建掩码(umask)。这意味着子进程所能访问的系统资源和执行的操作,受限于其父进程被赋予的权限范围。

  • 特殊进程类型

    • 孤儿进程(Orphan Process)
      当父进程在子进程尚未结束前就提前退出或崩溃了,这个还在继续运行的子进程就会变成孤儿进程。孤儿进程不会一直在系统中“游荡”,因为系统中的 PID 1(初始进程)会自动接管这些失去父进程的进程,成为它们的新父进程,并在它们最终退出时妥善清理相关资源。
    • 僵尸进程(Zombie Process)
      当一个子进程已经执行完毕并释放了大部分内存和资源,但其父进程尚未通过调用 wait() 或 waitpid() 来读取它的退出状态时,这个已经“死亡”的进程残骸就会变成僵尸进程。僵尸进程不再占用 CPU 和内存,但在进程表中仍然会保留一个位置(占用一个 PID)。如果系统中积累了大量僵尸进程且父进程迟迟不回收,可能会耗尽系统的 PID 资源,导致新进程无法创建。

查看与检索进程

静态进程查看 ps

语法与核心参数 核心功能与运行机制 实用操作示例
ps aux
(BSD 风格)
静态捕获系统当前时刻的进程快照。打印当前瞬间所有进程的详细状态(CPU/内存占用、启动时间、执行命令等)。 ps aux | grep nginx
(查找与 nginx 相关的进程)
ps -ef
(System V 风格)
标准全格式显示进程及其层级。清晰列出所有进程的 UID、PID、PPID(父进程 ID)及启动参数。 ps -ef | grep sshd
(查看 SSH 进程及其父子继承关系)
ps -o 自定义字段输出。仅打印指定的列,便于脚本提取特定属性。 ps -eo pid,ppid,user,%cpu,%mem,cmd
(定制提取关键维度数据)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root 1 0.0 0.1 167888 9600 ? Ss Sep16 0:02 /sbin/init

# USER : 进程所有者的用户名 (UID)
# PID : 进程标识符 (Process ID)
# %CPU : 进程自启动以来占用 CPU 的百分比
# %MEM : 进程占用物理内存 (RAM) 的百分比
# VSZ : 虚拟内存大小 (Virtual Memory Size,单位:KB),包含进程可访问的所有内存(含共享库及# 未调入内存页)
# RSS : 常驻内存大小 (Resident Set Size,单位:KB),进程实际占用的非交换 (Non-Swapped) 物# 理内存大小
# TTY : 进程运行的终端类型(? 表示无终端的后台守护进程,tty1-6 为本地终端,pts/N 为远程 # SSH/虚拟终端)
# STAT : 进程当前运行状态标识符(详见下方“STAT 状态代码表”)
# START : 进程启动的具体时间(若启动超过 24 小时则仅显示日期)
# TIME : 进程累计消耗 CPU 的总时间(格式为 MM:SS 或 HH:MM:SS)
# COMMAND : 启动进程的完整命令行指令及参数

动态性能监控 top

语法与核心参数 核心功能与运行机制 实用操作示例
top 动态实时监控系统进程与资源。按固定时间间隔(默认 3 秒)刷新 CPU、内存占用以及各进程的实时排名。 top
(直接进入交互式动态界面)
top -p <PID> 精准监控指定进程。仅追踪特定 PID 进程及其线程的资源消耗。 top -p 1234
(监控 PID 为 1234 的进程)
top -u <USER> 过滤指定用户的进程。仅显示特定用户发起的进程列表。 top -u nginx
(仅监控 nginx 用户的进程)
top -b -n 1 批处理模式(Batch mode)。不启动交互界面,仅输出 1 次当前快照,常用于脚本分析或日志留存。 top -b -n 1 > top_snapshot.txt
(保存当前资源占用快照)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
top - 19:43:37 up 1 day,  4:12,  2 users,  load average: 0.15, 0.08, 0.02
Tasks: 215 total, 1 running, 214 sleeping, 0 stopped, 0 zombie
%Cpu(s): 1.5 us, 0.5 sy, 0.0 ni, 97.8 id, 0.1 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 7812.5 total, 3150.2 free, 2410.8 used, 2251.5 buff/cache
MiB Swap: 2048.0 total, 2048.0 free, 0.0 used. 5100.1 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1234 mysql 20 0 1850.4m 450.2m 18.5m S 2.3 5.6 12:34.56 mysqld

# 【第一行:系统基本信息与负载】
# 19:43:37 : 当前系统时间
# up 1 day... : 系统运行时长(已连续运行 1 天 4 小时 12 分钟)
# 2 users : 当前登录系统的总会话/用户数
# load average : 系统在过去 1分钟、5分钟、15分钟 内的平均负载(单核 CPU 达到 1.0 表示满载)
#
# 【第二行:任务/进程统计】
# Tasks : 进程总量情况(total: 总进程数, running: 运行中, sleeping: 休眠中, stopped: 暂停, zombie: 僵尸进程数)
#
# 【第三行:CPU 状态(所有 CPU 核心平均值)】
# us (user) : 用户态进程占用 CPU 百分比
# sy (system) : 内核态/系统进程占用 CPU 百分比
# ni (nice) : 调整过 Nice 优先级的用户进程占用 CPU 百分比
# id (idle) : 空闲 CPU 百分比
# wa (iowait) : 等待磁盘/网络 I/O 操作完成占用的 CPU 时间百分比(数值偏高说明磁盘性能存在瓶颈)
# hi (hardware): 硬中断 (Hardware IRQ) 占用 CPU 时间百分比
# si (software): 软中断 (Software Interrupts) 占用 CPU 时间百分比
# st (steal) : 被虚拟化宿主机“偷走”的 CPU 时间百分比(虚拟机环境独有)
#
# 【第四行与第五行:内存与交换分区 (Mem / Swap)】
# total : 物理内存 / 交换分区总容量
# free : 未使用的空闲内存容量
# used : 已占用的内存容量
# buff/cache : 用于内核缓冲区 (Buffers) 和页面缓存 (Page Cache) 的内存容量
# avail Mem : 预计在不使用 Swap 的情况下,新程序可获得的实际可用物理内存容量

# 【进程状态列表区】
# PID : 进程标识符
# USER : 进程所有者的用户名
# PR : 进程调度的动态优先级 (Priority),数值越小优先级越高(RT 表示实时进程 Real-Time)
# NI : 进程的静态 Nice 值(范围 -20 到 19,越小代表优先级越高,负值仅 root 可设)
# VIRT : 进程申请的虚拟内存总量(单位:KB/MB/GB)
# RES : 进程使用的未被换出的物理内存大小(与 ps 命令的 RSS 一致)
# SHR : 进程使用的共享内存大小 (Shared Memory,如动态链接库占用的内存)
# S : 进程当前状态(R: 运行中, S: 休眠, D: 不可中断休眠, Z: 僵尸, T: 跟踪/停止)
# %CPU : 进程上次刷新以来占用的 CPU 利用率(多核环境下单进程占用单核 100% 可超过 100%)
# %MEM : 进程占用的物理内存百分比
# TIME+ : 进程启动后占用 CPU 的累计百分之一秒时间(格式:分:秒.厘秒)
# COMMAND : 进程名称或启动指令

进程检索工具 pgrep/pidof

命令 匹配机制与特点 常用选项参数 实用操作示例
pgrep 灵活性高(支持正则/模糊匹配)。
根据进程名称的关键字或正则表达式检索进程,默认输出所有匹配到的 PID 列表。
• -l:同时列出 PID 和进程名称
• -a:列出 PID 并显示完整的命令行参数
• -u:限定指定用户的进程
• -f:匹配完整的命令行路径而不仅是进程名
• pgrep -a nginx
(列出包含 nginx 的进程 PID 及完整启动命令)
• pgrep -u root sshd
(查找 root 用户运行的 sshd 进程 PID)
pidof 精确度高(必须精准匹配程序名)。
只接受二进制可执行文件的精确名称(或绝对路径),精准查找并返回该程序对应的 PID。
• -s:单次匹配,仅返回第一个找到的 PID
• -o:忽略/排除指定的 PID(omit)
• pidof nginx
(精准获取 nginx 主进程和工作进程的所有 PID)
• kill -9 $(pidof httpd)
(结合杀进程指令,精准杀死 httpd 服务)

进程间通信

在 Linux 系统中,每个进程拥有独立的虚拟地址空间,进程间无法直接访问彼此的内存。为了实现数据交换与协作,操作系统提供了多种进程间通信(Inter-Process Communication, IPC)机制,例如管道、信号(Signal)、共享内存、消息队列以及 Socket 套接字等。

常用系统信号

信号(Signal) 是 Linux 系统中最古老、轻量级的进程间异步通知机制。内核或进程可以向目标进程发送特定信号,强制其触发默认或自定义的处理逻辑。

可通过 kill -l 命令查看完整信号列表,以下为 RHCE 运维与开发中常用的系统信号:

信号编号 信号名称 默认动作 核心用途与运行机制 实用指令 / 触发场景
1 SIGHUP 终止进程 挂起 / 重载配置。终端断开时通知进程;常用于通知守护进程重新加载配置文件而不重启服务。 kill -1 <PID> 或 systemctl reload
2 SIGINT 终止进程 中断信号。通常由前台交互终端发起,请求进程平滑停止。 键盘按下 Ctrl + c
9 SIGKILL 强制终止 无条件杀死进程。无法被进程捕获、忽略或阻塞,由内核直接强行销毁进程。 kill -9 <PID> (高危/最后手段)
15 SIGTERM 终止进程 软件终止信号(kill 命令的默认动作)。允许被捕获,给进程留出时间清理资源并优雅退出。 kill <PID> 或 systemctl stop
20 SIGTSTP 暂停/挂起 终端停止信号。由终端发送的暂停请求,与 SIGSTOP 类似但允许被进程捕获。 键盘按下 Ctrl + z

发送信号的工具

命令 匹配机制与目标定位 核心功能与运行机制 实用操作示例
kill 精确 PID 定位。
只接受数字形式的进程 ID(PID)作为参数。
向单个或指定多个 PID 发送特定信号(默认为 SIGTERM -15)。由于只依赖数字 PID,它是最精准、最安全的信号发送命令。
• -1 (-SIGHUP):请求进程重新加载配置文件
• -9 (-SIGKILL):强制杀死进程(内核直接销毁)
• -15 (-SIGTERM):默认信号,请求进程优雅退出
• -l:列出系统支持的所有信号列表
kill 7926
(向 PID 7926 发送 SIGTERM 请求优雅退出)
kill -9 7926
(发送 SIGKILL 强制杀死进程)
kill -1 6568
(发送 SIGHUP 命令重载配置)
killall 精确进程名定位。
接收二进制可执行文件的完整名称。
按进程名批量杀死同名进程。扫描所有运行中的进程,向所有进程名完全匹配的进程统一发送信号。
• -i:交互式模式,杀进程前逐个提示确认
• -u <USER>:限定仅杀属于指定用户的进程
• -s <SIGNAL> / -信号编号:指定发送的信号(如 -9)
• -w:等待所有被杀的进程完全退出后命令才返回
killall httpd
(杀死所有名为 httpd 的进程)
killall -9 nginx
(强制杀死所有 nginx 进程)
killall -u devops httpd
(仅杀死 devops 用户运行的 httpd 进程)
pkill 高级条件/正则匹配定位。
支持根据进程名模糊/正则匹配、用户、终端等多种维度筛选。
按高级维度批量筛选并发送信号。内部匹配逻辑与 pgrep 一致,能根据多维约束精准清洗特定上下文的进程。
• -u <USER>:匹配指定有效用户(UID/用户名)的进程
• -t <TTY>:匹配指定控制终端(如 pts/1)上的进程
• -f:匹配完整的命令行路径和参数,而不仅是进程名
• -9:强行杀死匹配筛选条件的所有进程
pkill -u devops
(踢掉/结束 devops 用户的所有进程)
pkill -t pts/1
(终止连接在终端 pts/1 上的所有进程)
pkill -f "python3 main.py"
(按完整命令行匹配并杀掉进程)

后台作业

后台作业(Background Job) 是指在 Linux Shell 中被推到“后台”运行、不占用当前终端命令行交互界面的进程或任务。

当你将一个命令放到后台运行时,它可以在操作系统底层默默执行,而当前的终端会立即恢复响应,允许你继续输入并执行其他命令。
如果没有对输出进行重定向(如 > output.log 2>&1),后台作业打印的信息依然会直接弹在你的终端屏幕上,可能会打断你当前正在输入的命令(建议配合重定向使用)。

命令 / 快捷键 匹配机制与作业定位 核心功能与运行机制 实用操作示例
命令 & 命令后缀标记 直接在后台启动进程。执行命令时在末尾加上 &,使命令不在前台占用终端交互界面,直接以后台作业形式运行。但在默认情况下,当终端窗口(SSH 会话)关闭时,该作业仍可能收到 SIGHUP 信号而终止。 python3 script.py &
(在后台启动 Python 脚本,释放终端控制权)
jobs 当前终端会话 查看当前 Shell 终端管理的所有后台作业。列出当前终端下的作业编号(Job ID)、运行状态(Running / Stopped)以及对应的启动指令。
• -l:同时显示作业编号对应的真实进程 PID
• -r:仅列出处于运行中(Running)状态的后台作业
• -s:仅列出处于挂起/停止(Stopped)状态的后台作业
jobs -l
(查看作业编号、PID 及对应命令)
fg 作业编号定位 (%JID)
(若不带参数,默认作用于当前/最近的作业 %+)
将后台作业调至前台运行。恢复前台交互控制,使进程重新接入当前终端的标准输入与输出。 fg %1
(将编号为 1 的后台作业转到前台继续运行)
fg
(将默认关联的最近一个作业转到前台)
Ctrl + z 当前前台作业 将前台运行的作业挂起(Suspend)并推入后台。向当前前台进程发送 20) SIGTSTP 信号,立即暂停进程执行并将控制权交还终端。注意:此时进程处于停止(Stopped)状态,并未在后台继续运行,需配合 bg 恢复。 在运行长耗时命令时按 Ctrl+z
(暂停前台任务并返回 Shell 提示符)
bg 作业编号定位 (%JID)
(若不带参数,默认作用于最近被挂起的作业 %+)
让后台处于挂起状态的作业恢复运行。向指定的 Stopped 状态作业发送 18) SIGCONT 信号,使其在后台继续默默执行(保持 Running 状态)。 bg %1
(恢复编号为 1 的挂起作业,让其在后台继续运行)
kill %JID 作业编号定位 (%JID)
(注意编号前必须带有 % 符号)
通过作业编号(Job ID)结束后台任务。由于 kill 默认接受 PID 参数,使用 % 前缀可明确告知系统该数字为 jobs 列表里的作业编号而非系统 PID。
• kill %1:发送 15) SIGTERM 请求优雅终止
• kill -9 %1:发送 9) SIGKILL 强制销毁该作业
kill %1
(结束编号为 1 的后台作业)
kill -9 %2
(强制杀死编号为 2 的后台作业)
nohup 命令前缀包装 忽略挂起信号 (SIGHUP -1)。包装目标命令,使其脱离终端挂断事件的影响。即便 SSH 会话断开或终端关闭,进程仍能在后台持续运行。默认会将标准输出与错误重定向输出到当前目录的 nohup.out 文件中。 nohup python3 script.py &
(永久脱离终端,在后台挂起稳定运行)
disown 作业编号定位 (%JID) 从 Shell 的作业表中移除指定的后台任务。移除后该任务不再受当前 Shell 会话控制,关闭终端时 Shell 也不会向其发送 SIGHUP 信号,适合补救忘记加 nohup 启动的后台进程。
• -h:不移除作业,仅标记使其忽略 SIGHUP 信号
• -a:作用于当前终端的所有后台作业
python3 script.py &
disown -h %1
(将已运行的 1 号作业标记为忽略终端挂断信号)

后台作业默认仍然是当前登录 Shell 的子进程,并归入当前 Shell 的作业列表(可通过 jobs 查看)。默认情况下,如果你直接关闭终端窗口或断开 SSH 连接,当前终端会向其所有的后台作业发送 SIGHUP(挂断信号),导致后台作业随之终止。
nohup 命令 重定向 & 可以让后台作业不会随着终端退出而退出。
如果不指定重定向,则默认重定向到 nohup.out。