摘要:本文系统讲解 Linux 文本处理与系统管理的核心命令,涵盖通配符、正则表达式、文本处理命令(tr、sort、sed、cut、paste、join、uniq)、文本匹配命令(wc、grep、find、diff)、数值计算(expr、bc、calc)、常用内置命令、系统信息查看、文件系统管理、文件权限管理、网络操作、文件压缩与打包、输入输出重定向与管道、用户管理以及服务管理等十六个章节,帮助读者从基础到进阶全面掌握 Linux 命令行操作技能。
目录
Global Regular Expression Print,文本搜索(最重要)。
目录中存储的内容——目录项(Directory Entry):
12.4 traceroute:追踪数据包达到目标经过的路由路径
12.6 netstat / ss:查看网络连接状态和侦听端口
15.3 useradd / userdel:创建和删除用户
15.4 groupadd / groupdel / usermod:管理用户组和修改用户属性
第五章 文本处理
5.1 通配符(glob)
用简单的特殊符号(如 `*`、`?`、`[]`)来匹配一组符合某种模式的文件名或字符串。

5.2 正则表达式
正则表达式(Regex)是 Linux 系统中最强大、最常用的文本处理工具之一。它是一种用于匹配、查找、替换和提取文本模式的“语言”,被广泛应用于文本处理工具中。
随着 GNU 工具的发展,现代的 BRE 和 ERE 在功能上的界限已经变得模糊,最主要的区别体现在元字符是否需要使用反斜杠进行转义。
正则表达式是用一些特殊字符(称为“元字符”)来定义一种搜索模式。它可以精确地匹配特定格式的文本。
正则表达式的三种主要类型

基础元字符(BRE)

数量限定符(ERE)
正则表达式核心元字符 - 分组与或

示例:
2026-3-25 转换成 3/25/2026
今天是2026-3-25,我。。。。。。。
--> 今天是3/25/2026,我。。。。。。。
2026-4-25是一个好日子
(^.*)([0-9][0-9][0-9][0-9])-([0-9]?[0-9])-([0-9]?[0-9])(.*$)
\1\3\/\4\/\2\5
cat file | sed -E "s/(^.*)([0-9][0-9][0-9][0-9])-([0-9]?[0-9])-([0-9]?[0-9])(.*$)/\1\3\/\4\/\2\5/"
PCRE:增强的现代正则表达式



常见正则表达式实例

5.3 文本处理命令
本节将介绍 7 个常用的文本处理命令,下表汇总了它们的用途、典型用法和常用选项,方便快速查阅。
| 命令 | 用途 | 典型用法 | 常用选项 |
|---|---|---|---|
| tr | 字符替换、删除与压缩 | echo 'hello' | tr 'a-z' 'A-Z' | -d 删除字符;-s 压缩重复字符;-c 取反 |
| sort | 对文本行进行排序 | sort -n file | -n 按数字排序;-r 逆序;-t 指定分隔符;-k 指定排序字段 |
| sed | 流式文本编辑(替换、删除、插入) | sed 's/旧/新/g' file.txt | -i 直接修改文件;-n 静默输出;-e 多个操作;-r/-E 扩展正则 |
| cut | 按列或字符位置切割文本 | cut -d: -f1 /etc/passwd | -d 指定分隔符;-f 选择列;-c 按字符位置;--complement 排除列 |
| paste | 按列拼接多个文件的内容 | paste file1.txt file2.txt | -d 指定分隔符;-s 多行拼接为单行 |
| join | 按关键字段合并两个文件 | join s1.txt s2.txt | -a 保留未匹配行;-i 忽略大小写;-1/-2 指定合并列 |
| uniq | 去除已排序文件中的重复行 | sort file.txt | uniq -c | -c 统计次数;-d 只显示重复行;-u 只显示不重复行;-i 忽略大小写 |
tr - 字符替换与删除sort - 文本排序sed - 流编辑器(替换/删除/插入)cut - 按列切割文本paste - 按行拼接文本join - 关键字段合并文件uniq - 去重与计数正则表达式 (regular expression)
tr:字符替换与删除
Translate,字符替换、删除和压缩。
bash
# 大小写转换
echo 'hello' | tr 'a-z' 'A-Z' # HELLO
# 字符删除 -d
cat file.txt | tr -d '0-9' # 删除所有数字
# 空白压缩 -s
echo 'a b' | tr -s ' ' # a b
# 取反 -c
echo 'a b c' | tr -c 'a ' 'd' # 替换为 a d d
示例:
# 八进制、转义字符
echo -e 'abc\n123' | tr '\010' 'X' # 将八进制 010 (\n) 改成 X
echo $'abc\nddd' | tr '\n' '\r'
echo -e 'abc\tddd' | tr '\t' '\n'
sort:文本排序
bash
# 按字符顺序排序
sort file
# 按数字顺序排序
sort -n file
# 指定分隔符 -t
sort -t: file
常用选项:

sed:流编辑器
Stream Editor,强大的流式文本编辑。
bash
# 文本替换 s
sed 's/旧/新/g' file.txt # 全局替换(g)
sed 's/^/Hello/' file.txt # 在行头添加 Hello
sed 's/$/Hello/' file.txt # 在行尾添加 Hello
sed -i 's/旧/新/g' file.txt # 直接修改文件(-i)
sed -n '1,5p' file.txt # 打印 1-5 行
sed '/^$/d' file.txt # 删除空行
sed '/^#/d' file.txt # 删除注释行
sed 's/error/& Hello/' file.txt # error 后面添加 Hello(& 代表匹配到的内容)
# 文本添加 a i
sed '2a Hello' file.txt # 在第 2 行后面添加 Hello
sed '2i Hello\nHello' file.txt # 在第 2 行前面添加 Hello
sed 'a Hello' file.txt # 在尾行后面添加 Hello
sed '/error/a 请检查错误' # 在包含 error 的行后面添加 Hello
# 顺序执行多个操作 -e
sed -e 's/a/A/g' -e 's/AB/cd/' file.txt # 顺序执行操作
# 执行文件中指定的操作 -f
sed -f command file.txt # 执行 command 文件中的操作
# 使用扩展正则表达式(ERE)-r 或 -E
echo '123abc' | sed -r 's/([0-9]+)([a-z]+)/\2\1/g' # 输出 abc123
示例:修改一行中第 4 列的数据

bash
cat a
# 1 lwt 80 65 89
# 2 abd 80 65 89
echo $ID # 1
echo $Score # 90
sed -r 's/(^$ID\t)(.*\t)(.*\t)(.*\t)(.*$)/\1\2\3$Score\t\5/' a
# 1 lwt 80 90 89
# 2 abd 80 65 89
sed -r 或 -E 启用扩展正则表达式(ERE)功能
sed 's/1+:/hello/g'
# 示例:将目录下所有.txt文件改成.csv文件
ls *.txt > list
sed -r 's/(^.*)(.txt)/mv \1\2 \1.csv/' list > cmd
bash cmd
ls *.csv
rm list cmd
cut:按列或字符位置切割文本
bash
# 按分隔符切割
echo 'a:b:c' | cut -d: -f2 # b
cat /etc/passwd | cut -d: -f1 # 提取用户名
cat /etc/passwd | cut -d: -f1,3,6 # 多列
cat file | cut -d$'\t' -f1-3 # 使用 Tab 作为分隔符
# 按字符位置
echo 'abcdef' | cut -c1-3 # abc
cut -c5- /etc/hostname # 第 5 字符到行尾
# 补充模式(排除列)
cut -d: -f1,3 --complement /etc/passwd
# 压缩没有匹配到列分隔符的行的输出
cut -s -d: -f2 file.txt
# 指定输出的列分隔符
cut -f1-2 --output-delimiter '#' file.txt
paste:按列拼接多个文件的内容
bash
# 默认 TAB 分隔
paste file1.txt file2.txt
# 自定义分隔符
paste -d: names.txt phones.txt
# 多行拼接为单行
paste -s file.txt
# 每两行拼成一行
paste - - < file.txt
join:联合文件
按关键字段合并(需排序)。
bash
sort -o s1.txt f1.txt && sort -o s2.txt f2.txt # 先将 f1.txt 和 f2.txt 排序
join s1.txt s2.txt # 按相同关键字合并
join -a 1 s1.txt s2.txt # 保留 f1 全部记录
join -i s1.txt s2.txt # 忽略大小写
join -1 <column> -2 <column> s1.txt s2.txt # 选择两个文件中的合并列
uniq:文件去除重复
去除已排序文件中的连续重复行。
bash
sort file.txt | uniq # 去重
sort file.txt | uniq -c # 统计行的出现次数
sort file.txt | uniq -d # 只显示重复的行,每个重复行显示一次,-D 为重复行全部显示
sort file.txt | uniq -u # 只显示不重复的行
sort file.txt | uniq -i # 忽略大小写
5.4 本章小结
本章系统讲解了 Linux 文本处理的核心工具。通配符(glob)用于快速匹配文件名,正则表达式则提供了更强大的模式匹配能力,包括基础元字符(BRE)、数量限定符(ERE)和增强的现代正则表达式(PCRE)。在文本处理命令方面,tr 负责字符替换与删除,sort 用于文本排序,sed 作为流编辑器可完成替换、删除、插入等操作,cut 按列或字符位置切割文本,paste 按列拼接多个文件,join 按关键字段合并文件,uniq 去除重复行。掌握这些工具的组合使用,可以高效完成日常的文本处理任务。
第六章 文本匹配命令
6.1 wc:计数
统计文件行数、词数和字节数。
bash
wc file.txt # 行数 词数 字节数
# 128 1024 8192 file.txt
cat file.txt | wc -l # 以管道方式输入
wc -l file.txt # 只显示行数
wc -w file.txt # 只显示词数
wc -c file.txt # 只显示字节数
# 实用技巧:
wc -l *.py # 统计所有 .py 行数
ps -ef | wc -l # 统计进程数量
6.2 grep:文本搜索
Global Regular Expression Print,文本搜索(最重要)。
bash
grep 'error' /var/log/syslog # 搜索关键字,文件可以通过通配符进行匹配,如:sys*
grep -i 'error' log.txt # 忽略大小写
grep -v '#' config.ini # 排除注释行
grep -n 'warning' log.txt # 显示行号
grep -c 'failed' log.txt # 统计次数
grep -r 'main' src/ # 递归搜索目录
grep -w 'is' file.txt # 整词匹配
# 显示上下文:
grep -A 2 'error' log.txt # 匹配行及后面 2 行
grep -B 2 'error' log.txt # 匹配行及前面 2 行
grep -C 2 'error' log.txt # 匹配行及前后各 2 行
# 正则表达式:
grep '^[0-9]' file.txt # 以数字开头的行
grep '\.txt$' list.txt # 以 .txt 结尾
grep -e 'err' -e 'warn' log # 包含 err 或者 warn 的行
# 使用扩展正则表达式(ERE):
grep -E 'aa|aaa|error|info' file
# 使用 Perl 兼容正则表达式(PCRE):-P
#查找多个数字 echo "123" | grep -Po '\d+'
#查找多个空白字符 echo "123 4" | grep -Po '3\s+4'
#匹配数字(整数、小数、正负数) echo "122.3abc+5.0-3.4xy&" | grep -Po '[+-]?\d+(\.\d+)?'

6.3 find:递归查找文件
bash
# 按名称查找
find / -name '*.txt' # 查找 .txt 文件
find / -name 'nginx.conf' # 查找配置文件 nginx.conf
# 按类型 / 大小查找
find . -type d # 查找目录
find . -size +1M # 大于 1MB 的文件,-size n[cwbkMG]
# 执行操作:
find . -name '*.tmp' -delete # 删除 .tmp
find . -name '*.c' -exec wc -l {} \; # 统计找到的 .c 文件的行数
6.4 diff:比较两个文件的差异
bash
diff file1.txt file2.txt # 基本比较
diff -u file1.txt file2.txt # 统一格式(推荐)
diff -i file1.txt file2.txt # 忽略大小写
# 统一格式输出示例:
# --- file1.txt 2026-06-01
# +++ file2.txt 2026-06-02
# @@ -1,3 +1,3 @@
# -old text
# +new text
6.5 本章小结
本章介绍了 Linux 文本匹配的核心命令。其中 wc 用于快速统计文件的行数、词数和字节数,是日常检查文件规模和进程数量的常用工具;grep 是最重要的文本搜索命令,支持基本正则、扩展正则(-E)和 Perl 兼容正则(-P),配合 -i、-v、-n、-r 等选项可以灵活完成日志过滤、配置检查和代码检索等任务;find 用于按名称、类型、大小等条件递归查找文件,并可结合 -exec 或 -delete 对结果执行操作;diff 用于比较两个文件的差异,-u 统一格式输出便于阅读和生成补丁。掌握这些命令,可以大幅提升在 Linux 环境下定位和分析文本信息的效率。
第七章 数值计算
7.1 expr - 简单整数运算
7.1.1 整数运算
expr <数值计算表达式> # 支持 + - * / (整除) % (取模) 运算
bash
expr 10 + 5 # 注意,每个元素之间都要用空格分开
expr 10 - 2
expr 5 \* 3 # 乘法计算,需要转义
expr 10 / 3 # 得到 3(取整)
expr 10 % 3 # 得到 1(取模)
expr 5 \* \( 5 + 5 \) # 得到 50
value=$(expr 10 / 3) # value = 3
7.1.2 比较运算:
expr <比较表达式> # 支持 = != < > <= >= 结果为真返回1,假返回0
bash
expr 10 = 5 # 得到 0
expr 5 \> 3 # 得到 1,需要转义
7.1.3 逻辑运算:
expr <逻辑表达式> # 支持 & (与) | (或)
bash
expr 10 \& 2 # 得到 10,如果两个参数都非空且非 0,则返回第一个参数;否则返回 0
expr 5 \| 3 # 得到 5,如果第一个参数非空且非 0,则返回它;否则返回第二个参数
7.2 bc:Basic Calculator
支持整数和浮点数运算(通过 scale 指定精度),支持进制间转换(obase、ibase),支持变量计算。支持的运算符:`+ - * / % ^`(指数),支持交互式模式、管道模式,支持函数、判断、循环等。
bash
echo "10/3" | bc # 输出 3
echo "scale=2; 10/3" | bc # 输出 3.33
echo "obase=16; 255" | bc # 输出 FF(十进制转十六进制)
echo "ibase=16; FF" | bc # 输出 255(十六进制转十进制)
echo "x=5; y=3; x*y + 2" | bc # 输出 17

7.2.1 bc循环


7.2.2使用数学库 `bc -l`:

7.3 calc
原生支持科学计数法,内置了复数、矩阵、超过 70 个统计函数等高级功能。
7.4 本章小结
本章介绍了 expr、bc、calc 三种数值计算工具,它们各有侧重,适用于不同的场景。下面通过表格对比三者的核心差异,帮助读者快速做出选择。
| 对比维度 | expr | bc | calc |
|---|---|---|---|
| 适用场景 | Shell 脚本中的简单整数运算、字符串比较与逻辑判断 | 需要高精度小数运算、进制转换、数学函数(配合 -l)的脚本计算 | 交互式科学计算、复数与矩阵运算、统计分析等高级场景 |
| 精度支持 | 仅支持整数,无小数 | 支持任意精度小数,可通过 scale 控制小数位数 | 原生支持科学计数法,精度高,适合浮点与复数运算 |
| 内置函数 | 无数学函数,仅支持基本算术、比较和逻辑运算符 | 配合 -l 提供 sqrt、sin、cos、log 等常用数学函数 | 内置超过 70 个统计函数,支持复数、矩阵等高级运算 |
| 性能特点 | 轻量、启动快,适合脚本内频繁调用 | 精度高但启动稍慢,适合批量或管道计算 | 功能强大但体积较大,适合交互式或复杂科学计算 |
选择建议:
- 如果只是在 Shell 脚本中做简单的整数加减乘除或条件判断,优先使用 expr,它轻量且无需额外安装。
- 如果涉及小数运算、需要控制精度或进行进制转换,推荐使用 bc,它是 Linux 系统自带的通用计算器。
- 如果需要进行科学计算、复数、矩阵或统计分析等高级功能,选择 calc,它能提供更强大的数学能力。
第八章 其他常用内置命令
8.1 clear:清屏
clear # 清屏并清除 屏幕缓冲区
bash
clear # 清屏并清除屏幕缓冲区
clear -x # 清屏,但不清除屏幕缓冲区
8.2 alias/unalias
为命令设置别名,提高效率
bash
alias ll='ls -alF' # 设置别名
alias rm='rm -i' # 防止误删
alias ..='cd ..' # 快速返回上级
alias # 查看所有别名
unalias rm # 取消别名
# 永久生效:写入 ~/.bashrc
echo "alias ll='ls -alF'" >> ~/.bashrc
source ~/.bashrc # 执行 ~/.bashrc,使命令生效
8.3 echo :输出
bash
echo 'Hello World' # 输出字符串
echo $HOME # 输出变量值
echo -e '第一行\n第二行' # 启用转义
echo -E '第一行\n第二行' # 关闭转义,输出 第一行\n第二行
8.4 read:读取输入
bash
read -p '输入姓名: ' name # 带提示
read -s -p '密码: ' pass # 静默输入
read -t 5 -p '5秒内输入: ' x # 超时
8.5 printf:格式化输出
bash
printf '%03d\n' 5 # 005
printf '%.2f\n' 3.14159 # 3.14
说明符:

格式修饰符:

8.6 nano / vi / vim:终端文本编辑器
bash
# nano - 简单易用
nano file.txt
# Ctrl+O 保存,Ctrl+X 退出,Ctrl+W 搜索
# vim - 功能强大
vim file.txt
# i 进入插入模式,Esc 退出
# :w 保存,:q 退出,:wq 保存退出
# :q! 强制退出,/关键词 搜索
# n/N 上下切换匹配结果
8.7 本章小结
本章介绍的 clear、alias、echo、read、printf 以及 nano / vi / vim 等命令,是日常终端操作中使用频率最高的内置命令。它们虽然功能简单,却能在脚本编写和交互式操作中发挥关键作用:clear 用于保持终端界面整洁,alias 用于简化高频命令,echo 用于输出文本和变量,read 用于接收用户输入,printf 则提供更精确的格式化输出能力。
在实际使用中,这些命令经常组合出现。例如,通过 alias 定义常用命令的快捷方式,再配合 echo 输出提示信息,用 read 接收用户输入,最后用 clear 清理屏幕,可以快速搭建一个简单而实用的交互式脚本。下面给出一个组合使用这些命令的示例:
#!/bin/bash
# 组合使用 clear、alias、echo、read 的简单脚本示例
clear # 清屏,保持界面整洁
为常用命令设置别名
alias ll='ls -alF'
alias grep='grep --color=auto'
echo "欢迎使用系统信息查询工具"
echo "----------------------------------------"
使用 read 接收用户输入
read -p "请输入要查询的用户名: " username
echo "正在查询用户 $username 的信息..."
echo "----------------------------------------"
输出查询结果
id $username
echo "----------------------------------------"
echo "查询完成,感谢使用!"
这个脚本先用 clear 清屏,再通过 alias 为 ls 和 grep 设置更友好的别名,随后用 echo 输出提示信息,并用 read 接收用户输入的用户名,最后调用 id 命令查询该用户的信息。读者可以将这段脚本保存为 info.sh,通过 bash info.sh 运行,体会这些内置命令组合使用的实际效果。
此外,这些内置命令还经常与文本处理命令配合使用。例如,用 read 读取用户输入后,通过 printf 进行格式化输出,再结合 sort 或 grep 对数据进行处理,可以构建出功能更完整的命令行工具。掌握这些命令的组合用法,是提升 Shell 脚本编写效率的关键一步。
第九章 系统信息查看
uname, cpuinfo - 查看内核版本与系统架构free - 查看内存使用情况df , du - 查看磁盘分区和使用情况top , uptime - 查看实时进程和资源占用nice renice - 调整进程的优先级hostname - 查看/修改主机名date - 查看/设置系统时间ps - 查看进程列表kill - 终止进程
9.1 uname:查看系统核心信息
bash
uname -a
# Linux ubuntu22 5.15.0-91-generic #101-Ubuntu SMP x86_64 x86_64 x86_64 GNU/Linux
uname -r # 内核版本(5.15.0-91-generic)
uname -m # 架构(x86_64)
uname -n # 主机名(ubuntu22)
9.2 lscpu:查看 CPU 信息
bash
lscpu
输出示例:
9.3 free:查看内存信息
bash
free -h
输出示例:

显示物理内存条的详细信息:
bash
sudo dmidecode -t memory
9.4 df / du:查看磁盘和目录空间
bash
df -h # 磁盘分区使用(人性化)
df -hT # 显示文件系统类型
# Output:
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 20G 8G 12G 41% /
du -sh /home/user # 查看目录总大小
du -sh * | sort -h # 按大小排序
9.5 top:实时动态监控系统资源
- `top` → # 启动实时监控
#交互快捷键:
- `P` → 按 CPU 排序
- `M` → 按内存排序
- `1` → 展开多核 CPU
- `H` → 显示线程
- `k` → 杀进程
- `q` → 退出
9.6 uptime:系统负载和运行时间
bash
uptime
输出示例:
![]()
各项含义:
- 当前系统时间:21:19:19
- 系统已运行的时间:34 分钟
- 当前系统中登录的用户数:1
- 系统在过去 1 分钟、5 分钟和 15 分钟内的平均负载:0.00、0.01、0.04
9.7 nice / renice:调整系统优先级
直接影响进程在 CPU 资源竞争中的能力。
nice -n <优先级> <命令> # 运行命令之前,设置命令的系统优先级
# <优先级>:-20 到 19。数值越小,优先级越高。
# 非 root 用户只能调低命令的优先级;root 用户可以调高命令的优先级
renice -n <优先级> -p <进程号> # 运行命令期间,更改命令的系统优先级
renice -n <优先级> -i <userid>
验证示例:
使用 top -p <id> 验证系统优先级变化
bash
#!/usr/bin/bash
echo $$
while true ;
do
:
done
9.8 hostname:查看或临时修改主机名
bash
hostname # 查看当前主机名
# 输出:ubuntu22
sudo hostname <新的主机名> # 临时修改(重启失效)
sudo hostnamectl set-hostname <新的主机名> # 永久修改
cat /etc/hostname # 永久主机名配置文件
9.9 date:查看和格式化系统时间
bash
date
# Mon Jun 30 21:30:00 CST 2026
date +'%Y-%m-%d' # 2026-06-01
date +'%Y/%m/%d %H:%M:%S' # 2026/06/01 10:30:00
date -d '+1 day' # 明天日期
date -d '-1 week' # 一周前
9.10 ps:查看当前系统运行的进程
bash
ps -ef # 查看所有进程(完整格式)
ps -aux # BSD 格式(更详细)
ps -u user # 查看指定用户的进程
ps -ef | grep nginx # 查找特定进程
输出字段:
UDI: 用户ID PID:进程ID PPID:父进程ID %CPU:CPU占用率 %MEM 内存占用率
- `STAT`:`R` 运行,`S` 睡眠,`Z` 僵尸,`T` 暂停,`I` 空闲
- `STAT`:`<` 高优先级,`N` 低优先级,`l` 多线程进程,`+` 前台进程,`s` 会话领导者

9.11 kill:终止系统中的进程
bash
kill 1234 # 发送 SIGTERM(请求终止)
kill -9 1234 # 发送 SIGKILL(强制终止)
# 查找并杀死:
ps -ef | grep firefox # 先查 PID
kill -9 <PID> # 再杀死
kill -l # 列出所有 KILL 信号
# 快捷方式:
pkill firefox # 按进程名终止
9.12 watch:周期性执行命令
bash
watch [-n <interval>] -d <command>
# -n 执行周期(s)
# -d 显示两次执行结果的不同
# 每隔两秒钟,查看系统资源的使用情况
watch -n 2 -d free
# 定期查看目录下的文件,文件名中包含 log
watch -n 1 'ls -l | grep log'
9.13 timeout:指定命令执行时间
到时后退出。
bash
# 在执行 watch 命令 1 分钟后退出
timeout 1m watch -n 2 -d free
# 如果在指定时间内命令完成,则正常退出,否则强制退出
timeout 10 ls -l
echo $?
timeout 10 sleep 100
echo $? # 查看退出状态
time timeout 10 sleep 100
9.14 本章小结
本章围绕 Linux 进程管理展开,核心内容包括:
- 进程查看:掌握
ps、top、htop等工具,能够实时监控系统进程状态与资源占用。 - 进程控制:理解
kill、pkill、killall的信号机制,学会优雅终止或强制结束进程。 - 后台与前台任务:熟练使用
&、jobs、fg、bg管理前后台任务,掌握nohup让任务在终端关闭后继续运行。 - 任务调度:通过
at安排一次性任务,通过cron实现周期性任务,通过timeout限制命令执行时间。
进程管理是 Linux 运维的基础能力,建议读者在真实环境中反复练习,理解信号与进程状态之间的转换关系。
第十章 文件系统管理
什么是 Linux 文件系统?"一切皆文件" 哲学文件系统类型本地磁盘文件系统特殊用途文件系统FHS 目录结构
10.1 文件系统概念
文件系统定义了数据在存储设备上存放、读取、更新和删除的规则和方法。

10.2 一切皆文件
Linux 核心哲学:不仅是普通数据文件,硬件设备、进程信息、网络连接等都被抽象为文件,通过统一接口访问。

硬件设备被抽象为文件:

进程与内核信息被抽象为文件:

系统配置与设备参数被抽象为文件(`/sys`):

10.3 文件系统类型
本地磁盘文件系统:
- **ext4**:最主流的日志文件系统,单文件上限 16 TB,单卷上限 1 EB。Ubuntu 默认。
- **XFS**:高性能,支持并发 I/O。RHEL/CentOS 默认。
- **Btrfs**:写时复制,支持快照和子卷。openSUSE 默认文件系统。
- **ZFS**:集成卷管理,企业级存储。
- **FAT32/exFAT/NTFS**:Windows 兼容,通过 `ntfs-3g` 驱动进行挂载(mount)。
VMware Workstation 中,物理 USB 磁盘被挂载到 `/mnt/media` 目录下。
VMware Workstation 可以将任意 Windows 目录映射到虚拟机系统 `/mnt/hgfs` 目录下。

特殊用途文件系统(虚拟 / 伪文件系统):
- `proc`:进程和内核信息(`/proc/cpuinfo`)
- `sysfs`:设备和内核对象(`/sys`)
- `tmpfs`:基于内存,速度极快(`/tmp`)
- `devfs`:管理设备文件(`/dev`)
10.4 文件系统层次结构标准(FHS)
FHS 标准目录详解:

10.5 目录是一种特殊的“文件”
目录中存储的内容——目录项(Directory Entry):

验证:用 `ls -lai` 查看文件的 inode 编号。
从文件名到数据:完整链路

关键点:`open("/home/user/notes.txt")` → 内核逐级查找每个目录项的 inode → 最终读取文件数据块。
10.6 inode 与目录的关系图解

10.7 硬链接 vs 符号链接
均创建链接到源文件的目标文件。
硬链接:
ln <source> <target> # 类似于 Windows 的 mklink /H
bash
ls -l original_file # 源文件
ln original_file linkfile # 创建硬链接文件
ls -li original_file linkfile
stat original_file linkfile
硬链接示例:

符号链接:
ln -s <source> <target> # 类似于 Windows 的 mklink /D
bash
ls -l original_file # 源文件
ln -s original_file slinkfile # 创建符号链接文件
ls -li original_file slinkfile
stat original_file linkfile
readlink -f slinkfile
符号链接示例:


对比:

10.8 本章小结
本章深入讲解了 Linux 文件系统与链接机制,核心要点包括:
- 文件系统结构:理解
/根目录下的标准目录布局,掌握df、du查看磁盘与目录占用。 - inode 与数据块:明白文件由 inode 和数据块组成,inode 保存元数据,数据块保存实际内容。
- 硬链接与符号链接:硬链接共享同一 inode,删除原文件不影响链接;符号链接是独立文件,指向目标路径,目标删除后链接失效。
- 文件查找:熟练使用
find、locate、which等命令定位文件。
理解 inode 与链接机制是深入掌握 Linux 文件系统的关键,建议通过实际操作对比硬链接与符号链接的行为差异。
第十一章 文件权限管理
11.1 权限概述
- 三类用户:`u`(所有者)、`g`(所属组)、`o`(其他人)
- 三种权限:`r`(4)读取、`w`(2)写入、`x`(1)执行
- `chmod`:修改访问权限
- `chown`:修改文件所有者
- `chgrp`:修改所属组
- `umask`:设置默认权限掩码
11.2 ls -l 权限解读
查看并理解文件权限格式

11.3 chmod:修改文件或目录的访问权限
# 符号模式:
chmod u+x script.sh # 所有者加执行权限
chmod g-w file.txt # 组去掉写入权限
chmod a+x script.sh # 所有人加执行权限
# 数字模式(最常用):
chmod 755 script.sh # rwxr-xr-x
chmod 644 file.txt # rw-r--r--
chmod 600 secret.txt # rw-------
chmod -R 755 /www # 递归修改
11.4 chown / chgrp:修改所有者和所属组
需要 root 权限。
bash
# chown:修改所有者
sudo chown john file.txt # 改所有者
sudo chown john:dev file.txt # 同时改组
sudo chown :dev file.txt # 仅改组
sudo chown -R john:john /home/john # 递归
# chgrp:修改所属组
sudo chgrp developers file.txt
sudo chgrp -R developers /project
11.5 umask:设置新建文件和目录的默认权限
bash
umask # 查看当前掩码
# 输出:0002
umask 0022 # 设置掩码
# 文件默认权限 = 666 - umask
# 目录默认权限 = 777 - umask
umask 0022 -> 文件 644 (rw-r--r--)
umask 0022 -> 目录 755 (rwxr-xr-x)
umask 0077 -> 文件 600 (仅所有者读写)
11.6 本章小结
本章聚焦 Linux 文件权限与用户管理,核心内容包括:
- 权限体系:理解读(r)、写(w)、执行(x)三种权限,掌握
chmod修改权限、chown修改所有者。 - 特殊权限:了解 SUID、SGID、Sticky Bit 的作用与适用场景。
- 默认权限:掌握
umask如何影响新建文件和目录的默认权限。 - ACL 访问控制:使用
setfacl、getfacl实现细粒度的权限管理。
权限管理是 Linux 安全的基础,建议读者结合多用户场景练习,理解权限位与 umask 的计算逻辑。
第十二章 网络操作
ping - 测试网络连通性traceroute - 追踪路由路径ifconfig/ip - 查看网络接口netstat/ss - 查看网络连接wget/curl - 下载与网络传输scp/sftp - 远程文件复制
12.1 网络协议栈
Ethernet/IP 协议栈:

12.2 网络拓扑

12.3 ping:测试网络连通性
bash
ping -c 4 8.8.8.8
# 输出示例:
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=117 time=12.3ms
--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss
# time=12.3ms → 延迟 12.3 毫秒
12.4 traceroute:追踪数据包达到目标经过的路由路径
bash
traceroute baidu.com
# 输出示例:
# 192.168.1.1 1.123 ms
# 10.0.0.1 3.456 ms
# 202.96.128.86 8.901 ms
# 39.156.66.10 12.345 ms```
每跳显示:节点 IP + 延迟时间。用于网络故障排查。
12.5 ifconfig / ip:查看和配置网络接口
bash
# ifconfig(需安装 net-tools)
sudo apt install net-tools -y
ifconfig
# inet 192.168.1.100 netmask 255.255.255.0
# ip 命令(新版推荐):
ip addr show # 查看所有 IP 地址(ip ad)
ip route show # 查看路由表
ip link set eth0 down # 关闭网卡
ip link set ens33 up # 开启网卡
12.6 netstat / ss:查看网络连接状态和侦听端口
bash
# netstat:
netstat -tul # TCP/UDP 侦听端口
netstat -tunlp # 显示对应进程(需 root)
# ss(更高效,推荐):
ss -tul # 查看所有侦听端口
ss -tunp # 显示进程信息
# 常用:查看端口是否被占用
ss -tul | grep 3306 # 查找 MySQL 端口
12.7 wget:从网络下载文件
bash
wget https://example.com/file.zip
wget -O myfile.zip https://example.com/file.zip # 指定文件名
wget -P /tmp/ https://example.com/file.zip # 指定目录
wget -c https://example.com/bigfile.zip # 断点续传
wget -q https://example.com/file.zip # 静默模式
# 实用示例:
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz
12.8 curl:通过 URL 语法传输数据
API 调试利器。
bash
# 下载文件
curl -O https://example.com/file.zip
curl -o myfile.zip https://example.com/file.zip
# API 请求(开发者常用)
curl https://gitee.com # GET
curl -X POST -d 'name=john' https://example.com/api # POST
# 查看响应头
curl -I https://www.baidu.com
# HTTP/2 200
12.9 scp:远程文件复制
与远程系统之间安全复制文件,使用 ssh 协议进行底层数据传输。
bash
# 本地 → 远程
scp file.txt john@192.168.1.100:/home/john/
scp -r project/ john@192.168.1.100:/home/john/ # 目录
# 远程 → 本地
scp john@192.168.1.100:/home/john/file.txt .
# 指定端口
scp -P 2222 file.txt john@192.168.1.100:/home/john/
12.10 sftp:远程文件管理
sftp 在 scp 的基础上,提供了交互式会话,支持浏览、管理远程目录,功能更全。

sftp [-P <port>] <user>@<remote ip>
12.11 本章小结
本章介绍了 Linux 远程管理与文件传输工具,核心要点包括:
- SSH 远程登录:掌握
ssh连接远程主机,理解密钥认证与端口配置。 - SCP 文件传输:使用
scp在本地与远程之间安全复制文件。 - SFTP 交互式传输:通过
sftp进行交互式文件管理,支持上传、下载、目录浏览。 - 远程执行:利用
ssh在远程主机上执行单条命令,实现批量运维。
远程管理是 Linux 运维的必备技能,建议读者配置 SSH 密钥认证,提升连接安全性与便捷性。
第十三章 文件压缩与打包
zip/unzip - 跨平台压缩格式gzip/gunzip - 单文件压缩tar - 打包工具(最常用)
13.1 zip / unzip:跨平台压缩格式
创建和解压 ZIP 格式的压缩包
bash
zip archive.zip file1.txt file2.txt # 压缩多个
zip -r archive.zip dir/ # 压缩目录
zip -9 archive.zip bigfile.txt # 最大压缩比
zip archive.zip file.txt -P password # 加密
unzip archive.zip # 解压到当前目录
unzip archive.zip -d /tmp/ # 解压到指定目录
unzip -l archive.zip # 查看内容(不解压)
13.2 gzip / gunzip:单文件压缩与解压
bash
gzip file.txt # 压缩为 file.txt.gz(原文件消失)
gzip -k file.txt # 压缩并保留原文件
gzip -9 file.txt # 最大压缩比
gunzip file.txt.gz # 解压
gzip -d file.txt.gz # 解压(同上)
gzip -dk file.txt.gz # 解压保留压缩包
zcat file.txt.gz | head # 查看压缩文件内容
13.3 tar:打包和解包(最核心)
Tape Archive。
bash
# 打包:
tar -czf archive.tar.gz dir/ # 打包 + gzip(最常用)
tar -cjf archive.tar.bz2 dir/ # bzip2 压缩
# 解包:
tar -xzf archive.tar.gz # 解压 + 解包
tar -xzf archive.tar.gz -C /tmp/ # 解压到指定目录
# 查看:
tar -tf archive.tar.gz # 查看包内文件列表
第十四章 输入输出重定向与管道
14.1 输入输出重定向与管道
> 和 >> - 输出重定向(覆盖/追加)2> 和 2>&1 - 错误重定向< - 输入重定向<< HERE - HERE 文档<<< 变量输入| 匿名 管道 - 命令串联mkpipe - 有名管道tee - 同时输出到终端和文件&& ,|| 和 ; - 命令连接符后台执行命令screen / tmux
文件句柄:
- `0`:标准输入,键盘
- `1`:标准输出,终端
- `2`:标准错误输出,终端
14.2 > / >> 输出重定向
输出重定向:将命令结果写入文件
bash
ls > /tmp/filelist.txt # 覆盖写入
echo 'hello' >> log.txt # 追加写入
# 标准输出和标准错误:
ls /valid > out.txt # 正常输出到文件
ls /nonexist 2> err.txt # 错误信息到文件
# 合并输出:
cmd > all.txt 2>&1 # 输出 + 错误合并
cmd &> all.txt # 简化写法
cmd > /dev/null 2>&1 # 全部丢弃
14.3 输入重定向
将文件内容作为命令的输入。
bash
cat < /etc/hostname # 从文件读入并显示
sort < unsorted.txt # 对文件内容排序
tr 'a-z' 'A-Z' < file.txt # 转为大写
cat - < file
cat 0< file
# 结合输入输出:
cat < input.txt > output.txt # 复制
sort < unsorted.txt > sorted.txt # 排序后保存
14.4 HERE 文档
多行输入重定向,常用于脚本中生成文件。
bash
cat << EOF
这是多行文本
直到遇到分隔符 EOF 为止
EOF
# 示例:保存到文件:
cat > config.txt << END
server=my_server
port=8080
END
14.5 变量输入
14.5.1<<< 变量输入
bash
input="1 2 3"
read a1 a2 a3 <<< $input
# 将变量 input 的内容作为输入,读入到 a1 a2 a3 三个变量中
示例:将文件 abc 中的三行数据一次性赋值给三个变量

14.5.2 < <( 变量输入
将变量作为输入
bash
input="1 2 3"
read a1 a2 a3 < <( echo $input)
# 将变量 input 的内容作为输入,读入到 a1 a2 a3 三个变量中
`<(cmds)` 命令的作用是:执行 cmds,将输出结果写入到一个匿名的文件中,进行一次性的使用,用完即刻销毁。

14.6 | :匿名管道
将一个命令的输出作为另一个命令的输入。
bash
ls -l | grep 'txt' # 筛选 .txt 文件
ps -ef | grep nginx # 查找进程
history | tail -20 # 最近 20 条历史
# 多级管道:
cat /etc/passwd | cut -d: -f1 | sort | head -10
# 显示前 10 个用户(按字母排序)
# 统计:
ps -ef | wc -l # 统计进程数
14.7 mkfifo:有名管道
Make FIFO,创建有名管道(进程间通信)。
bash
mkfifo mypipe # 创建管道文件
root@DESKTOP-3094FQG:~# mkfifo tube
root@DESKTOP-3094FQG:~# ls -l tube
prw-r--r-- 1 root root 0 Sep 14 14:11 tube
# 终端 1:读取管道
cat mypipe
# 终端 2:写入管道
echo 'Hello' > mypipe
# 终端 1 会立即收到写入的内容
14.8 tee:同时输出到终端和文件
bash
ls -l | tee filelist.txt # 显示并保存
# 追加模式 -a
echo 'backup start' | tee -a log.txt
# 典型应用:
date | tee -a script.log
echo '开始备份' | tee -a script.log
cp -r /data /backup 2>&1 | tee -a script.log
echo '备份完成' | tee -a script.log

14.9 && || ;命令连接符:条件执行
bash
# && - 前一个成功才执行后一个
ls /valid_dir && echo '目录存在'
make && make install # 编译成功才安装
# || - 前一个失败才执行后一个
ls /nonexist || echo '路径不存在'
ping -c 1 server || echo '服务器不可达'
# ; - 无论成功与否都执行
echo A ; ls /nonexist ; echo B

14.10 后台执行命令
14.10.1命令连接符:条件执行
bash
# 在命令后面添加 &,会将命令执行转入后台执行
sleep 100 &
# 使用 ps 可以查看在后台运行的命令
ps -f
# Ctrl-Z 组合键终止正在前台运行的命令

14.10.2后台管理:
bash
bg # 将使用 Ctrl-Z 挂起的命令转入后台运行
bg %<id>
fg # 将命令从后台恢复到前台
fg %<id>
jobs # 查看在后台运行的命令
jobs
kill # 删除在后台运行的命令
kill %1
14.10.3 nohup
nohup 让命令在 用户退出登录或关闭终端后,仍能继续运行
bash
# nohup 让命令在用户退出登录或关闭终端后,仍能继续运行。
# nohup 会将命令的标准输出(stdout)和标准错误(stderr)都重定向到当前目录下一个名为 nohup.out 的文件中
nohup <command>
nohup <command> 1> 标准输出文件 2>&1 # 使用自定义的文件
14.10.4 disown
disown 让命令 和 运行该命令的进程脱离,由 PID = 1 的进程托管运行
# 1. 前台运行命令
# 2. 使用 Ctrl-Z 强制停止命令运行
# 3. 使用 bg %1 将命令转入到后台运行
# 4. 使用 disown %1 将命令与当前进程脱离
14.10.5 ()
( ) 在独立子进程中运行命令
1. fork 一个全新的子 Shell 进程2. 子进程继承父进程的环境变量3. 但子进程的所有变量修改、操作,都不会影响父进程!4. 执行完成后,子进程自动退出
$ ( cat file.txt ; sleep 10 && )
14.11 子进程与 exec
14.11.1 exec
exec 的核心作用是用新进程替换当前进程,或者改变当前 Shell 的文件描述符
# exec:替换当前进程(执行命令)
# 调用 exec 后,当前进程的代码段、数据段被新程序替换
# PID 保持不变
# 原 Shell 的后续代码不再执行
#!/bin/bash
echo "这是 PID $$"
exec ls -l
echo "这行永远不会执行!"
#! /bin/bash
echo "这是 PID $$"
exec sleep 100
echo "在另一个终端ps 查看sleep 进程号"
14.11.2 重定向当前shell文件描述符
重定向当前 Shell 的文件描述符,常用于把整个脚本的输入/输出重定向到文件:
bash
exec [n] <file # 以 FD n 打开 file 中的内容
exec [n] >file # 将 FD n 的输出重定向到 file 中
exec [n] >& m # 将 FD n 的输出重定向到 FD m 中
exec n > &- # 关闭 FD <n>
#!/bin/bash
exec 3< input # 以 fd 3 打开 input 读
read line <&3
echo "读到: $line"
exec 3<&- # 关闭 fd 3
#!/bin/bash
exec 3>>/tmp/a # 打开 fd 3,指向 /tmp/a 添加
exec 4>&3 # 将 fd 4 指向 fd 3
echo "hfsdjlello" >&4 # 把 echo 的输出写到 fd 4 -> fd 3
exec 4>&- # 关闭 fd 4
exec 3>&- # 关闭 fd 3
#!/bin/bash
exec 3>/tmp/a # 打开 fd 3,指向 /tmp/aecho "hello" >&3 # 把 echo 的输出写到 fd 3
exec 3>&- # 关闭 fd 3
14.12 screen:终端多路复用器
screen 是一个终端多路复用器,它允许在一个终端窗口中运行多个独立的终端会话,并且这些会话可以在后台运行,即使你断开 SSH 连接,它们也不会终止。

# 启动新会话
screen
screen -ls # 列出所有会话
screen -S <session-name> # 启动并命名会话
# 分离会话(Detach)
screen -d <session-name>
# 或者快捷键 Ctrl-a 然后按 d
# 重新连接会话
screen -r <session-name>
# 终止会话
exit # 从当前会话中输入
screen -X -S <session-name> quit # 从外部终止会话
# 多用户共享会话
screen -x <session-name>
常用快捷键:

14.13 tmux:screen 的升级版
bash
# 启动新会话
tmux
tmux new -s <session-name> # 启动并命名会话
# 分离会话(Detach)快捷键 Ctrl-b 然后按 d
# 重新连接会话
tmux attach -t <session-name>
# 终止会话
exit # 从当前会话中输入

第十五章 用户管理
who/whoami - 查看登录用户id - 查看用户信息useradd/userdel - 添加/删除用户passwd - 修改密码groupadd/groupdel - 管理用户组usermod - 修改用户属性/etc/passwd - 用户配置文件
15.1 who / whoami:查看登录用户
bash
who
# user pts/0 2026-06-01 09:00 (192.168.1.50)
# root tty1 2026-06-01 08:30
whoami # 查看当前登录用户名
who am i # 查看原始登录用户
15.2 id:查看用户 UID、GID 和所属组
bash
id # 查看当前用户
# uid=1000(user) gid=1000(user) groups=1000(john),4(adm),27(sudo)
id root # 查看指定用户
id -u user # 仅查看 UID
id -g user # 仅查看 GID
id -G user # 查看所有附属组 ID
15.3 useradd / userdel:创建和删除用户
需 root 权限。
bash
# 创建用户(完整参数):
sudo useradd -m -s /bin/bash -c 'John' john
# -m:创建 HOME 目录,-s:指定 Shell
# 创建后必须设置密码:
sudo passwd john
# 删除用户:
sudo userdel john # 保留 HOME
sudo userdel -r john # 同时删除 HOME
15.4 groupadd / groupdel / usermod:管理用户组和修改用户属性
bash
# 创建和删除组:
sudo groupadd -g 1005 developers
sudo groupdel developers # 组内必须无用户
# usermod 修改用户属性:
sudo usermod -aG sudo john # 添加到 sudo 组
sudo usermod -L john # 锁定用户
sudo usermod -U john # 解锁用户
# 关键用户文件:
/etc/passwd /etc/group /etc/shadow
第十六章 服务管理
systemctl - 控制系统服务(启停/自启/状态)crontab - 定时任务管理
16.1 systemctl:控制系统服务
管理系统服务的启动、停止和自启
bash
# 服务启停:
sudo systemctl start nginx # 启动
sudo systemctl stop nginx # 停止
sudo systemctl restart nginx # 重启
# 开机自启:
sudo systemctl enable nginx # 设置开机自启
sudo systemctl disable nginx # 取消自启
# 状态查询:
sudo systemctl status nginx # 查看详细状态
systemctl is-active nginx # 是否运行
systemctl list-units # 列出系统中的服务```
systemctl 状态输出
`systemctl status` 输出解读:
# 输出示例:
- nginx.service - A high performance web server
Loaded: loaded (/lib/systemd/system/nginx.service; enabled)
Active: active (running) since Mon 2026-06-01 09:00:00 CST
Main PID: 12345 (nginx)
Memory: 5.2M
# loaded: 已加载,enabled: 开机自启
# active (running): 正在运行
16.2 crontab:定时任务管理
bash
crontab -e # 编辑当前用户的定时任务
crontab -l # 查看当前用户的定时任务
crontab -r # 删除所有定时任务
# 格式:分 时 日 月 周 命令
# 0-59 0-23 1-31 1-12 0-7
# 示例:
0 2 * * * /home/john/backup_db.sh # 每天凌晨 2 点
*/5 * * * * /home/john/check.sh # 每 5 分钟
0 9 * * 1 /home/john/cleanup.sh # 每周一 9 点
1407



被折叠的 条评论
为什么被折叠?



