Linux
概述
简介
- 开源、免费的操作系统内核。广泛用于服务器、嵌入式设备、云计算等场景。
发展历史
Unix 的诞生
- 时间:1969年
- 地点:贝尔实验室(Bell Labs)
- 起源:“Unix”最初是作为“Multics”项目的替代品而诞生,后来成为现代操作系统的重要基石。
关键人物
Andrew S. Tanenbaum(谭宁邦)
- 开发了 Minix 操作系统(1984年)
- 用于教学目的,强调操作系统原理的学习
- Minix 是一个类 Unix 系统,但规模较小,适合学习使用
Richard Stallman(斯托曼)
发起 GNU 项目(GNU = "GNU's Not Unix")
目标:创建一个完全自由、开源、功能完整的 Unix-like 操作系统
推动开发了许多重要工具:Bash(Shell)、GCC(C语言编译器)、Gawk(文本处理工具)、Emacs(编辑器)
提出 GPL 协议(通用公共许可协议)
- 规则:
- 所有软件必须开源,允许获取和修改源代码。
- 修改后的版本也必须以开源方式发布(“传染性”)。
- 规则:
Linus Torvalds(托沃兹)
- 1991年,开发了 Linux 内核
- 原因:对 Minix 不满意,希望拥有更强大、可定制的操作系统
- Linux 内核是基于 Unix 设计哲学,但它是独立开发的
人物 贡献 关键成果 谭宁邦 教学驱动 Minix(小型类 Unix 系统) 斯托曼 开源理念 GNU 项目、Bash、GCC、GPL 协议 托沃兹 技术实现 Linux 内核(填补 GNU 缺失的部分) Linux 与 GNU 的结合
- Linux 内核 + GNU 工具链 = 完整的自由操作系统
- 因此,“Linux”常被误称为“Linux 系统”,实际上应为“GNU/Linux 系统”
- 例如:Ubuntu、CentOS、Fedora 都是基于 Linux 内核 + GNU 工具构建的发行版
历史时间线
- 1969:Unix 诞生(贝尔实验室)
- 1984:Minix 出现(谭宁邦)
- 1984:GNU 项目启动(斯托曼)
- 1991:Linux 内核发布(托沃兹)
💡 最终结果:
Linux 内核 + GNU 工具 = 完整的自由操作系统
这就是今天我们使用的各种 Linux 发行版的基础。
系统组成
- 内核(Kernel):核心,管理硬件与进程。
- Shell:命令行解释器。
- 文件系统:组织和管理文件。
- 应用程序:用户使用的各种软件。
发行版分类
| 发行版家族 | 代表发行版 | 特点 | 适用场景 |
|---|---|---|---|
| RHEL 系 | RHEL、Rocky、AlmaLinux | 企业级稳定,长期支持 | 服务器、生产环境 |
| CentOS Stream | RHEL 上游(滚动预览版) | 开发/测试 | |
| Fedora | 新技术试验田 | 开发者、尝鲜 | |
| Debian 系 | Debian | 稳定、自由软件 | 通用服务器 |
| Ubuntu | 用户友好,生态完善 | 桌面、云、开发 | |
| Kali Linux | 预装安全工具 | 渗透测试 | |
| SUSE 系 | openSUSE / SLES | 强大管理工具(YaST) | 企业、HPC |
| 国产系 | 麒麟、红旗 | 国产化替代 | 政企、信创 |
常用操作命令
文件和目录操作
| 命令 | 功能说明与常用参数 |
|---|---|
ls | 列出目录内容 • -l:长格式(显示权限、所有者、大小、时间等)• -a:显示隐藏文件(以 . 开头)• -h:配合 -l 以易读单位(KB/MB)显示大小• -t:按修改时间排序(最新在前) |
cd | 切换当前工作目录 • cd ~ 或 cd:回到当前用户主目录• cd ..:返回上一级目录• cd -:切换到上一个工作目录• cd /path/to/dir:进入指定目录 |
pwd | 显示当前完整路径(Print Working Directory) • -P:显示实际物理路径(不包含符号链接) |
mkdir | 创建目录 • -p:递归创建多层目录(如 mkdir -p a/b/c)• -v:显示创建过程(verbose)• 示例: mkdir -pv project/{src,bin,docs} |
touch | 创建空文件或更新文件的时间戳(访问/修改时间) • 可一次创建多个文件: touch file1 file2 |
cp | 复制文件或目录 • -r 或 -R:递归复制整个目录• -i:覆盖前提示确认(交互式)• -v:显示复制过程• 示例: cp -rv /etc/nginx ./backup/ |
mv | 移动文件/目录 或 重命名 • -i:覆盖前提示• -v:显示操作过程• 示例: 重命名: mv old.txt new.txt移动: mv *.log /var/log/ |
rm | 删除文件或目录 • -r:递归删除目录及其内容• -f:强制删除,不提示(慎用!)• -i:删除前确认(安全模式)⚠️ 警告: rm -rf / 会删除整个系统! |
vi / vim | 强大的文本编辑器 • 基本退出命令: :q — 退出(未修改时):q! — 强制退出,放弃修改:wq 或 :x — 保存并退出:w filename — 另存为• 编辑模式:按 i 进入插入模式,按 Esc 返回命令模式 |
cat | 查看小文件内容(concatenate) • cat file1 file2:合并输出多个文件 |
查询与辅助
| 命令 | 说明 | 推荐场景 |
|---|---|---|
command --help | 显示命令的简易帮助信息(短格式) 例如: cat --help | 快速查看常用参数,适合初学者 |
man command | 查看命令的 手册页(manual page),包含详细说明、选项、示例等 例如: man cat | 最常用、最全面的帮助方式 |
info command | 提供比 man 更详细的文档,支持超链接和导航例如: info cat | 学习复杂工具(如 gcc、gdb)时推荐使用 |
help command | 仅适用于 shell 内置命令(如 cd, echo, alias 等)例如: help cd | 查询 Bash 内置命令时使用 |
系统监控与进程管理
| 命令 | 主要功能 | 特点 | 典型用法与说明 |
|---|---|---|---|
ps | 显示当前进程的静态快照 | 一次性输出,适合脚本 | • ps aux:查看所有用户的所有进程(最常用)• ps -ef:显示完整格式,包含父进程 ID(PPID)• ps aux | grep nginx:查找特定进程 |
top | 动态显示 CPU、内存、进程排名 | 交互式,实时刷新(默认 3 秒) | • 直接输入 top 进入交互界面• 按 P 按 CPU 排序,M 按内存排序• 按 q 退出,k 可直接 kill 进程 |
kill | 向进程发送信号(如终止) | 默认发送 SIGTERM(15) | • kill 1234:优雅终止 PID 为 1234 的进程• kill -9 1234:强制终止(SIGKILL,慎用) |
df | 显示磁盘分区使用情况 | 查看存储空间 | • df -h:以人类可读单位(GB/MB)显示 |
du | 显示目录/文件占用空间 | 定位大文件或目录 | • du -sh /var/log:汇总显示 /var/log 总大小• du -h --max-depth=1 /home:查看 /home 下各子目录大小• du -ah /path | sort -rh | head -n 10:找出最大的 10 个文件/目录 |
进阶实用命令
| 命令 | 功能说明 |
|---|---|
| wc | 统计文件的行数、单词数、字节数(-l, -w, -c) |
| sort | 对文件内容按行排序(常用于配合 uniq) |
| uniq | 去除连续重复的行;加 -c 可统计重复次数⚠️ 注意:必须先排序才能完全去重(通常与 sort 联用) |
| dos2unix | 转换 Windows(DOS)格式文本为 Unix 格式(处理换行符 \r\n → \n) |
| diff / vimdiff | 比较两个文件差异;vimdiff 提供可视化对比 |
| which / whereis | 查询命令的可执行路径(which)或相关文件位置(whereis) |
| date | 查看或设置系统时间 |
| alias | 查看或设置简短别名,提升效率。示例:alias ll='ls -l' |
| tail | 查看文件末尾内容(10 行) • tail -n 20 file.log• tail -f file.log:实时监控 |
打包
| tar命令参数 | 含义 |
|---|---|
-c | create:创建新的归档文件 |
-x | extract:从归档中解压文件 |
-t | list:列出归档中的内容(不解压) |
-f | file:指定归档文件名(必须放在最后,后面紧跟文件名) |
-v | verbose:显示详细过程(可选,方便查看进度) |
-z | 用 gzip 压缩或解压(对应 .tar.gz 或 .tgz) |
-j | 用 bzip2 压缩或解压(对应 .tar.bz2) |
-J | 用 xz 压缩或解压(对应 .tar.xz) |
| 格式 | 打包压缩命令 | 解压命令 |
|---|---|---|
.tar | tar -cvf file.tar dir/ | tar -xvf file.tar |
.tar.gz / .tgz | tar -czvf file.tar.gz dir/ | tar -xzvf file.tar.gz |
.tar.bz2 | tar -cjvf file.tar.bz2 dir/ | tar -xjvf file.tar.bz2 |
.tar.xz | tar -cJvf file.tar.xz dir/ | tar -xJvf file.tar.xz |
四剑客 grep/sed/awk/find
1. grep —— 文本搜索过滤器
主要用途:在文件或输入流中按行匹配正则表达式,快速筛选内容。
核心特点:高效、支持正则、常用于日志分析。
常用参数:
-i:忽略大小写-v:反向匹配(显示不匹配的行)-r或-R:递归搜索子目录-n:显示匹配行的行号-l:只列出包含匹配内容的文件名
典型示例
bash
# 在 /var/log 及其子目录中递归查找包含 "error" 的行
grep -r "error" /var/log
# 过滤掉以 # 开头的注释行,仅显示有效配置
grep -v "^#" config.conf
# 在当前目录所有 .py 文件中搜索 "TODO",并显示所在行号
grep -n "TODO" *.py2. sed —— 流式文本编辑器
主要用途:对文本进行非交互式替换、删除、插入等操作,适合脚本自动化。
核心特点:逐行处理、支持正则替换、可直接修改文件。
常用参数:
-i:直接修改原文件(慎用!)-n:抑制默认输出(需配合p打印)s/old/new/g:全局替换(g表示一行内全部替换)
典型示例
bash
# 将 file 中所有 "foo" 替换为 "bar",输出到终端(不改原文件)
sed 's/foo/bar/g' file
# 直接删除 file 的第一行(原文件被修改)
sed -i '1d' file
# 仅打印 log 中包含 "ERROR" 的行(`-n` 关闭自动输出,`p` 显式打印匹配行)
sed -n '/ERROR/p' log3. awk —— 结构化文本处理器
主要用途:按列处理数据(如日志、CSV),支持条件判断、计算和格式化输出。
核心特点:类似轻量级编程语言,适合生成报表或提取字段。
常用参数/变量:
-F',':指定字段分隔符(如逗号)$1, $2...:表示第1、2…列NR:当前行号;NF:当前行字段数BEGIN{}/END{}:预处理和后处理块
典型示例
bash
# 打印每行的第一个字段(如 IP 地址或时间戳)
awk '{print $1}' file
# 以逗号分隔,筛选第二列数值大于 100 的行(适用于 CSV 数据分析)
awk -F',' '$2 > 100' data.csv
# 输出文件前 5 行(NR 是行号)
awk 'NR<=5' file4. find —— 文件系统查找工具
主要用途:根据名称、类型、时间、大小等条件查找文件或目录。 核心特点:功能强大、支持复杂组合条件、可联动其他命令执行操作。
常用参数:
-name "*.txt":按文件名匹配(支持通配符)-type f(文件)或-type d(目录)-mtime +7:7 天前修改过的文件-size +10M:大于 10MB 的文件-exec command {} +:对找到的文件批量执行命令
典型示例
bash
# 在当前目录及子目录中查找所有 .log 文件
find . -name "*.log"
# 删除 /tmp 中 7 天前 修改过的文件(⚠️ 谨慎使用 -delete!)
find /tmp -mtime +7 -delete
# 找到所有普通文件,并统一设置权限为 644(+ 表示高效批量传参)
find . -type f -exec chmod 644 {} +💡 组合技巧: 这四个命令经常串联使用,例如:
find . -name "*.log" -print0 | xargs -0 grep "ERROR" | awk '{print $1, $4}'
实现:查找日志 → 筛选错误 → 提取关键字段。
网络
| 命令 | 用途 |
|---|---|
ping | 测试网络连通性 |
curl | 测试 HTTP 接口 |
dig / nslookup | DNS 查询 |
权限与用户管理
| 命令 | 用途说明 | 常用示例 |
|---|---|---|
chmod | 修改文件或目录的权限(读 r、写 w、执行 x) | chmod 755 script.sh→ 所有者可读写执行,组和其他人可读执行 chmod +x file→ 给文件添加执行权限 |
chown | 修改文件或目录的所有者(可同时改所属组) | chown alice file.txt→ 将文件所有者改为 alicechown alice:dev file.txt→ 所有者改为 alice,所属组改为 dev |
chgrp | 修改文件或目录的所属组 | chgrp developers project/→ 将 project/ 目录的所属组改为 developers |
sudo | 以超级用户(root)或其他用户身份执行命令 | sudo systemctl restart nginx→ 以 root 权限重启服务 sudo -u bob whoami→ 以用户 bob 身份执行 whoami |
su | 切换到其他用户(默认切换到 root) | su -→ 切换到 root 并加载其环境 su - alice→ 切换到用户 alice |
附录
附1:$() 和 `` 对比
| 特性 | $() | `` |
|---|---|---|
| 可读性 | 高(括号匹配清晰) | 低(反引号易与单引号混淆) |
| 嵌套支持 | 直接嵌套: $ (cmd1 $ (cmd2)) | 需转义 |
| 转义处理 | 简单(内部双引号无需特殊处理) | 复杂(内部反引号需转义) |
| POSIX 标准 | ✅ 推荐 | ⚠️ 兼容但过时 |