RHCSA 学习笔记(一):命令行基础、用户权限、文本处理与进程管理
学习红帽课程中的一些笔记,本系列共 3 篇,这是第 1 篇。
- RHCSA 学习笔记(一):命令行基础、用户权限、文本处理与进程管理(本篇)
- RHCSA 学习笔记(二):网络、Shell 脚本、SSH、高级权限与文件系统
- RHCSA 学习笔记(三):软件包、系统服务、存储管理、SELinux、防火墙与容器
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.txtmv file.txt /tmp/ |
源路径与目标路径在同一目录下为“重命名”;在不同目录下为“移动”。跨文件系统移动文件时实质是“复制后删除”。 |
file |
查看文件真实类型 (File Type) |
• -b:简略模式,不显示文件名• -i:输出标准的 MIME 类型字符串 |
file /usr/bin/lsfile 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 | root:x:0:0:root:/root:/bin/bash |
暗码文件 /etc/shadow
/etc/shadow 用于存储用户账号的哈希加密密码(Password Hash)以及密码有效期、到期警告等安全策略。
1 | root:$6$xyz...123:19720:0:99999:7:14:20088: |
| 字段序号 | 字段名称 | 计数基准 / 换算公式 | 详细解读与应用场景 |
|---|---|---|---|
| 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 |
idid 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 devuserusermod -s /bin/bash devuser |
运维最常用 usermod -aG 给用户添加提权组(如 wheel 或 sudo)。切记:如果不加 -a 只写 -G,会导致该用户从之前的所有附加组中被移除! |
passwd |
修改用户密码 | • (无参数):修改当前登录用户的密码 • username:修改指定用户的密码(仅 root 可用)• -l / -u:锁定 / 解锁用户密码• -d:删除用户密码(清空后可免密登录)• --stdin:从标准输入读取密码(脚本批量设置密码神技) |
passwdecho "Password123" | passwd --stdin devuser |
普通用户修改自己密码需要遵循复杂性校验规则;root 管理员可以强行修改任意用户的密码且无需校验旧密码。 |
chage |
修改用户密码时效策略 (Change Age) |
• -l:查看用户的密码到期与时效详细报告• -M:设置密码最大有效天数• -m:设置密码最小修改间隔天数• -W:设置到期警告天数• -d 0:强制用户下一次登录时必须修改密码 |
chage -l devuserchage -M 90 -W 7 devuserchage -d 0 devuser |
直接操作 /etc/shadow 中关于天数限制的第 3 至第 8 字段。RHCE 考试中常用于配置企业级安全合规策略(如强制 90 天换密码、首次登录改密码等)。 |
组信息配置
用户组文件 /etc/group
/etc/group 记录了系统上所有用户组的基本属性,包括组名称、组 ID(GID)以及该组包含哪些成员用户。该文件对所有用户全局可读(权限 644),以便系统和程序能够将数字 GID 映射为可读的组名。
1 | wheel:x:10:root,devuser |
暗码组文件 /etc/gshadow
/etc/gshadow 是 /etc/group 的安全补充文件,存储了用户组的加密密码以及组管理员(Group Administrators)信息。为了防止未授权用户破译密码,该文件具有极高权限限制(仅 root 可读写,权限通常为 000 或 400)。
1 | wheel:$6$abc...789:root:devuser,testuser |
用户组相关管理命令
| 命令 | 核心功能 | 常用选项 / 参数 | 实用操作示例 | 深度解析与注意事项 |
|---|---|---|---|---|
groupadd |
创建新用户组 | • -g:指定组 ID (GID)• -r:创建系统用户组(GID 小于 1000) |
groupadd -g 2000 devgroupgroupadd -r sysadmin |
创建组时,系统会自动在 /etc/group 和 /etc/gshadow 中同步添加条目。指定 -r 参数可用于创建系统服务专用的组。 |
groupmod |
修改已有用户组属性 | • -n:修改组名• -g:修改组 ID (GID) |
groupmod -n newgroup oldgroupgroupmod -g 2005 devgroup |
修改 GID 后,原本属于该组的文件在磁盘上的 GID 不会自动变更,会导致那些文件显示为“无主 GID”(需要手动使用 chgrp 或 find 进行修复)。 |
groupdel |
删除用户组 | • (无特殊常用选项) | groupdel devgroup |
非常重要: 不能删除任何现有用户的初始主组(Primary Group)。如果某组仍是某个用户的初始主组,必须先修改该用户的初始主组或删除该用户后,才能删除该组。 |
groupmems |
管理指定组的成员 (需 root 或组管理员权限) |
• -g:指定要操作的目标组• -a:添加用户到组• -d:从组中删除用户• -l:列出该组的所有成员• -p:清空该组所有成员 |
groupmems -g devgroup -a user1groupmems -g devgroup -l |
比 usermod 更专注于“以组为中心”的成员管理,操作时直接修改 /etc/group 和 /etc/gshadow 中的成员列表。 |
gpasswd |
管理组密码、成员及组管理员 | • -a:添加用户到组• -d:从组中移除用户• -A:指定组管理员• -r:删除组密码• -M:批量设置组成员(覆盖式) |
gpasswd -a user1 devgroupgpasswd -d user1 devgroupgpasswd -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 | - rwx r-x r-- |
文件权限的查看以及修改
| 命令 | 核心功能 | 常用选项 / 参数 | 实用操作示例 | 深度解析与注意事项 |
|---|---|---|---|---|
ls -l |
查看文件权限及详细属性 | • -a:显示所有文件(包含 . 开头的隐藏文件)• -d:仅显示目录本身的属性,而非目录内的文件内容• -h:以人类可读的格式显示文件大小(如 K、M、G)• -Z:显示文件的 SELinux 安全上下文(RHCE 必考) |
ls -lals -ldh /var/logls -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.shchmod -R 770 /projectchmod u+x,g-w file.txtchmod 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.txtchown devuser:devgroup /appchown -R nginx:nginx /var/www/html |
仅 root 管理员可执行。使用 用户:组 语法可以一次性同时修改所有者和所属组;如果只写 chown :groupname file,效果等同于 chgrp;若写 chown user: file,则会把所属组自动同步修改为该用户的初始主组。 |
chgrp |
仅修改文件或目录的所属组 (Change Group) |
• -R:递归修改目录及其内部所有文件的所属组• --reference=ref_file:参照指定文件的属组进行修改 |
chgrp devgroup file.txtchgrp -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.txtls -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 | [root@lab opt]# echo abc | tr 'a-z' 'A-Z' # 小写转大写 |
- 拓展:三通管道(
tee命令)
1 | 用法: command1 | tee command2 | command3 |
- 示例:将
messages的内容保存到log1.txt,然后提取含error的行显示在屏幕
1 | [root@lab opt]# cat /var/log/messages | tee log1.txt | grep -i "error" |
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/binexport NODE_ENV="production" |
|
read |
交互式读取变量。接受用户键盘输入或标准输入,并将值赋给指定变量。 • -p:指定提示信息• -s:隐式输入(如密码) |
read -p "请输入用户名: " USERNAMEread -sp "请输入密码: " PASSWD |
|
| 变量查看 | echo $NAME |
打印单个变量的值。最常用的变量提取查看命令。 | echo $IPecho ${PORT} |
set |
查看当前终端的所有变量。显示当前 Shell 环境中定义的所有变量(包含局部自定义变量、环境变量和函数)。 | set | grep "IP="set | head -n 20 |
|
env / printenv |
查看当前所有环境变量。仅显示从导出并传递给子进程的环境变量(不包含普通局部变量)。 | envprintenv PATH(直接查看指定环境变量) |
|
declare -p [NAME] |
查看变量的属性和完整定义结构。显示变量的类型声明(如是否只读、是否数组)及精确赋值。 | declare -p PATHdeclare -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" ]; thenecho "必须使用 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 环境中生效的所有别名映射。 | aliasalias ll(查看特定别名 ll 的具体定义) |
| 取消别名 | unalias 别名 |
移除指定别名。从当前 Shell 环境中删除指定的别名定义(-a 参数可清空所有别名)。 |
unalias llunalias -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 资源,导致新进程无法创建。
- 孤儿进程(Orphan Process)
查看与检索进程
静态进程查看 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 | USER PID %CPU %MEM VSZ RSS TTY STAT START TIME 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 | top - 19:43:37 up 1 day, 4:12, 2 users, load average: 0.15, 0.08, 0.02 |
进程检索工具 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。