目录
2. yum 安装命令 (RHEL/CentOS/Fedora)
深入探索 Linux 操作系统:从基础到进阶
摘要: 本文旨在为读者提供一个全面且深入的 Linux 操作系统学习指南。内容涵盖操作系统发展简史、Linux 核心概念、常用命令行操作、系统管理、Shell 编程、Vim 编辑器、软件安装配置以及高级主题如特殊权限、系统启动流程和故障排除等。无论您是初学者还是希望巩固知识的开发者,都能从中获益。
第一部分:操作系统发展史与 Linux 概述
1. 操作系统的发展
现代操作系统的演进经历了多个重要阶段。早期的 Unix 系统(诞生于 1969 年贝尔实验室)因其强大的多用户、多任务处理能力和可移植性,奠定了现代操作系统的基础。随后出现的 Minix(由 Andrew S. Tanenbaum 教授开发)是一个面向教学的类 Unix 操作系统,以其简洁的微内核架构闻名。
2. Minix 没有火起来的原因
尽管 Minix 设计精良且适合教学,但其主要定位是教学和学术研究,而非商业化或大规模应用。同时,其源代码的早期分发策略限制了社区的广泛参与和发展,导致其影响力远不及后来的 Linux。
3. Linux 的崛起
1991 年,芬兰大学生 Linus Torvalds 出于个人兴趣开发了一个类 Unix 的内核,并将其命名为 Linux。Linux 继承了 Unix 的优良特性(如稳定性、安全性、多用户),并因其开源(GPL 协议) 和社区驱动的开发模式而迅速蓬勃发展。全球开发者可以自由使用、修改和分发 Linux,使其功能日益强大,应用范围极广(服务器、桌面、嵌入式、云计算等)。
4. Linux 内核 & 发行版
- Linux 内核: 这是操作系统的核心,负责管理硬件资源(CPU、内存、设备)、进程调度、文件系统、网络通信等。它是所有 Linux 发行版共有的基础。
- Linux 发行版: 由 Linux 内核 + GNU 工具 + 软件包管理系统 + 桌面环境 + 应用软件等组合而成的一个完整操作系统。常见发行版有:
- Debian 系:Debian, Ubuntu
- Red Hat 系:Red Hat Enterprise Linux (RHEL), Fedora, CentOS (曾是)
- SUSE 系:openSUSE, SUSE Linux Enterprise
- 其他:Arch Linux, Gentoo 等。
- Linux 内核版本: 遵循
主版本.次版本.修订版本[-稳定/长期支持]的命名规则(如5.4.0)。次版本为奇数表示开发版,偶数为稳定版。 - Linux 发行版本: 发行版有自己的版本号(如 Ubuntu 20.04 LTS),它们会选择特定的内核版本并集成大量软件。
5. 类 Unix 系统目录结构
Linux 继承了 Unix 的 Filesystem Hierarchy Standard (FHS) 目录结构,主要目录及其作用如下:
/:根目录/bin:存放基本用户命令(二进制可执行文件)/boot:存放启动相关的文件(如内核、引导程序)/dev:存放设备文件/etc:存放系统和应用程序的配置文件/home:用户的家目录,每个用户通常有一个子目录(如/home/username)/lib,/lib64:存放系统共享库文件/mnt:临时挂载点(如光盘、U盘)/opt:存放可选的第三方大型应用程序/proc:虚拟文件系统,映射进程和内核信息/root:超级管理员 root 的家目录/run:存放运行时文件(如 PID 文件、套接字)/sbin:存放系统管理员使用的命令/tmp:存放临时文件/usr:存放用户安装的软件、库、文档等(“Unix System Resources”)/var:存放经常变化的文件(如日志、邮件、数据库文件)- 用户目录: 通常位于
/home/username,是用户登录后的默认工作目录,拥有个人文件和配置(如~/.bashrc)。
第二部分:命令行基本操作
1. 命令使用方法
- 基本格式:
命令 [选项] [参数]。选项通常以-或--开头,用于改变命令行为;参数通常是命令操作的对象(如文件名)。 - 查看帮助文档:
命令 --help:快速查看命令的常用选项和参数。man 命令:查看命令的详细手册页(manual page),包含语法、选项、示例、描述等。按q退出。
- tab 键自动补全: 输入命令、文件名、目录名的前几个字母后按
Tab键,系统会自动补全或列出可能的选项。 - history 游览历史:
history命令列出最近执行过的命令历史记录。可以用!n(n 为历史编号)或!命令前缀快速执行历史命令。 - 命令行中的 ctrl 组合键:
Ctrl + C:终止当前正在运行的前台进程。Ctrl + Z:暂停当前前台进程(放入后台),可用fg恢复或bg后台继续运行。Ctrl + D:表示输入结束(EOF),或退出当前 shell(如退出su或ssh)。Ctrl + L或clear:清屏。
第三部分:文件与权限管理
1. 列出目录内容:ls
ls:列出当前目录内容。ls -l:长格式显示,包含文件权限、所有者、大小、修改时间等。ls -a:显示所有文件,包括隐藏文件(以.开头)。ls -lh:以更易读的方式(如 K, M, G)显示文件大小 (-h常与-l连用)。
2. 显示 inode 内容:stat
stat 文件名 显示文件的详细信息,包括 inode 号、权限、大小、链接数、所有者、所属组、访问/修改/变更时间等。
3. 文件访问权限
Linux 文件权限分为三类:
- 用户 (User/u):文件的所有者。
- 组 (Group/g):文件所属的用户组。
- 其他 (Other/o):既不是所有者,也不是所属组成员的用户。 每种身份对应三种权限:
- 读 (r):查看文件内容或列出目录内容。
- 写 (w):修改文件内容或在目录中创建/删除文件。
- 执行 (x):运行程序文件或进入目录。 权限用 9 个字符表示(如
rwxr-xr--),也可以用八进制数字(0-7)表示(如755对应rwxr-xr-x)。
4. 修改文件权限:chmod
- 符号模式:
chmod [ugoa][+-=][rwx] 文件名u(用户),g(组),o(其他),a(所有)+(添加),-(移除),=(设置)r,w,x- 例如:
chmod u+x script.sh(给所有者添加执行权限),chmod go-rw file.txt(移除组和其他用户的读写权限)。
- 数字模式:
chmod 权限值 文件名- 权限值 = (用户权限 * 100) + (组权限 * 10) + (其他权限 * 1)
- 权限值:
r=4,w=2,x=1(无权限=0) - 例如:
chmod 755 script.sh(用户:rwx, 组:r-x, 其他:r-x),chmod 644 file.txt(用户:rw-, 组:r--, 其他:r--)。
5. 修改文件所有者:chown
chown 新所有者[:新组] 文件名 修改文件的所有者(和所属组)。 例如:chown user1 file.txt (将所有者改为 user1), chown user1:group1 file.txt (同时修改所有者和所属组)。
6. 修改文件所属组:chgrp
chgrp 新组 文件名 修改文件的所属组。 例如:chgrp developers project/。
第四部分:文件内容查看与管理
1. 文件内容查看
- 基本显示:
cat 文件名:连接文件并打印到标准输出(一次性显示全部内容)。tac 文件名:反向显示文件内容(最后一行先显示)。
- 显示行号:
nl 文件名:显示文件内容并添加行号(默认显示空行)。
- 分屏显示:
more 文件名:分页显示文件内容,按Enter下一行,Space下一页,q退出。不能向前翻页。less 文件名:比more更强大,支持向前(b)和向后翻页,搜索(/),跳转(g/G)等。推荐使用。
- 取首尾 n 行:
head [-n 行数] 文件名:显示文件开头若干行(默认 10 行)。tail [-n 行数] 文件名:显示文件末尾若干行(默认 10 行)。tail -f 文件名实时追踪文件新增内容(常用于查看日志)。
2. 文件管理
- 输出重定向:
>命令 > 文件:将命令的标准输出覆盖写入到指定文件(文件不存在则创建)。命令 >> 文件:将命令的标准输出追加写入到指定文件。命令 2> 文件:将命令的标准错误输出覆盖写入文件。命令 &> 文件或命令 > 文件 2>&1:将标准输出和标准错误都覆盖写入文件。
- 管道:
|命令1 | 命令2:将命令1的标准输出作为命令2的标准输入。例如:ls -l | grep "txt"(列出长格式结果中所有包含 "txt" 的行),ps aux | less(分页查看进程列表)。 - 清屏:
clear或Ctrl + L - 切换工作目录:
cdcd或cd ~:进入当前用户的家目录。cd /path/to/dir:切换到绝对路径指定的目录。cd ..:切换到上一级目录。cd -:切换到上一次所在的目录。
- 显示当前路径:
pwd - 创建目录:
mkdirmkdir dirname:创建单个目录。mkdir -p parent/child:创建嵌套目录(父目录不存在则一起创建)。
- 删除文件:
rmrm file:删除文件。rm -r directory:递归删除目录及其所有内容(谨慎使用!)。rm -f file:强制删除,不提示确认。
- 建立链接文件:
lnln -s 源文件 链接文件:创建软链接(符号链接),类似于 Windows 的快捷方式。删除源文件,软链接失效。ln 源文件 链接文件:创建硬链接,指向同一个 inode。删除源文件,只要还有硬链接存在,文件内容不会被删除。硬链接不能跨分区,不能对目录创建(通常)。
- 文本搜索:
grepgrep [选项] "模式" 文件...在文件中搜索包含指定模式(字符串或正则表达式)的行。-i:忽略大小写。-v:反向匹配,显示不包含模式的行。-n:显示匹配行及其行号。-r:递归搜索目录。- 例如:
grep "error" /var/log/syslog(在系统日志中找 "error"),ps aux | grep "nginx"(查找 nginx 进程)。
- 查找文件:
findfind [路径] [选项] [操作]在指定目录树中查找满足条件的文件。-name "pattern":按文件名查找(支持通配符*,?)。-type f/d:查找文件(f)/目录(d)。-size [+|-]n[bcwkMG]:按大小查找(如+10M表示大于 10MB)。-mtime n:按修改时间查找(-nn天内,+nn天前)。-exec 命令 {} \;:对找到的文件执行命令({}代表找到的文件)。- 例如:
find /home -name "*.txt"(在 /home 下找所有 .txt 文件),find /var/log -mtime -7 -exec ls -l {} \;(查找 /var/log 下 7 天内修改过的文件并列出详细信息)。
- 拷贝文件:
cpcp 源文件 目标文件:拷贝文件。cp 源文件 目标目录:拷贝文件到目录。cp -r 源目录 目标目录:递归拷贝目录。cp -i:覆盖前提示确认。
- 移动文件:
mvmv 源文件 目标文件或mv 源文件 目标目录或mv 源目录 目标目录。功能是移动文件/目录,也可用于重命名(源和目标在同一目录时)。 - 归档管理:
tartar [选项] 归档文件.tar [文件/目录...]用于打包文件(不压缩)或解包。-c:创建归档文件。-x:解开归档文件。-v:显示详细过程。-f 文件名:指定归档文件名。-t:列出归档文件内容。- 例如:
tar -cvf project.tar project/(将 project 目录打包成 project.tar),tar -xvf project.tar(解包 project.tar)。
- 文件压缩解压
gzip 文件名:压缩文件(生成.gz后缀),gunzip 文件名.gz或gzip -d 文件名.gz解压。bzip2 文件名:压缩文件(生成.bz2后缀),bunzip2 文件名.bz2或bzip2 -d 文件名.bz2解压。- 结合
tar:tar -czvf project.tar.gz project/(打包并用 gzip 压缩)tar -xzvf project.tar.gz(解压 gzip 压缩的 tar 包)tar -cjvf project.tar.bz2 project/(打包并用 bzip2 压缩)tar -xjvf project.tar.bz2(解压 bzip2 压缩的 tar 包)
zip 归档名.zip 文件/目录...:创建 zip 归档(兼容 Windows),unzip 归档名.zip解压。
- 查看命令位置:
whichwhich 命令显示命令的完整路径(在PATH环境变量中查找)。例如:which ls可能显示/usr/bin/ls。
第五部分:用户和用户组管理
1. 用户管理
- 查看当前用户:
whoami - 查看登录用户:
who或w(更详细,显示用户正在做什么) - 退出登录账户:
exit或logout - 添加用户账号:
useraddsudo useradd -m 用户名:创建用户并创建其家目录(/home/用户名)。通常需要sudo权限。
- 修改用户:
usermodsudo usermod [选项] 用户名。常用选项:-l 新用户名(改用户名),-d 新家目录(改家目录),-g 新主组(改主组),-aG 附加组(添加附加组)。 - 设置用户密码:
passwdsudo passwd 用户名:管理员设置其他用户密码。passwd:普通用户修改自己的密码。
- 删除用户:
userdelsudo userdel 用户名:删除用户(保留家目录)。sudo userdel -r 用户名:删除用户并同时删除其家目录和邮件目录。
- 切换用户:
susu -或su - root:切换到 root 用户(需要 root 密码),-表示加载目标用户的环境变量。su username:切换到指定用户(需要该用户密码)。
- 以 root 身份执行指令:
sudosudo 命令。允许被授权的用户(在/etc/sudoers文件中配置)以 root 权限执行命令。执行时需要输入当前用户的密码(而非 root 密码)。配置需谨慎。
2. 用户组管理
- 添加、删除组账号:
groupadd,groupdelsudo groupadd 组名,sudo groupdel 组名。 - 用户组管理:
groupmodsudo groupmod -n 新组名 旧组名:修改组名。
第六部分:系统管理
1. 时间与日历
- 查看当前日历:
cal(显示当月日历),cal 年份(显示整年日历),cal 月份 年份(显示指定年月)。 - 显示或设置时间:
datedate:显示当前日期和时间。date "格式化字符串":按指定格式显示时间(如date "+%Y-%m-%d %H:%M:%S")。sudo date -s "YYYY-MM-DD HH:MM:SS":设置系统时间(需要 root 权限)。
2. 进程管理
- 查看进程信息:
psps aux:查看系统中所有用户的进程详细信息(常用组合)。ps -ef:类似aux,格式略有不同。ps -l:查看当前登录 shell 启动的进程。
- 以树状图显示进程关系:
pstree直观显示进程间的父子关系。 - 动态显示进程:
top或htop(更友好) 实时显示系统进程状态和资源占用(CPU、内存等),按q退出。 - 终止进程:
killkill PID:向指定 PID 的进程发送默认的SIGTERM(15) 信号,请求其终止。kill -9 PID:发送SIGKILL(9) 信号,强制立即终止进程(无法被捕获或忽略)。killall 进程名:终止所有同名进程。pkill 进程名:根据进程名终止进程。
3. 关机重启
reboot:重启系统。shutdown [选项] [时间] [消息]:安排关机或重启。shutdown -h now:立即关机。shutdown -r +10 "系统将重启":10 分钟后重启,并广播消息。
init 0:关机 (运行级别 0)。init 6:重启 (运行级别 6)。
4. 磁盘空间管理
- 检测磁盘空间:
dfdf -h:以易读格式显示所有已挂载文件系统的磁盘空间使用情况(总大小、已用、可用、使用率、挂载点)。 - 检测目录所占磁盘空间:
dudu -sh [目录名]:以易读格式显示指定目录的总大小 (-s只显示总计,-h易读)。
5. 网络管理
- 查看网络状态:
netstatnetstat -tuln:查看正在监听的 TCP (-t) 和 UDP (-u) 端口 (-l监听,-n显示数字地址)。常用参数组合-tulnp可显示关联的进程 PID/名称。 - 查看或配置网卡信息:
ifconfig(传统命令,逐渐被ip取代) 或ip addr show(显示 IP 地址)。 - 测试远程主机连通性:
pingping 主机名或IP地址:向目标主机发送 ICMP Echo 请求包,测试网络连通性和延迟。按Ctrl + C停止。
第七部分:Linux 磁盘管理 (进阶)
1. df 与 du
如前所述,用于查看文件系统使用情况和目录大小。
2. fdisk (或 parted, gdisk)
用于磁盘分区管理的命令行工具。可以查看 (fdisk -l)、创建、删除、修改磁盘分区。操作需谨慎,通常需要 root 权限。
3. 磁盘格式化
使用 mkfs 命令在分区上创建文件系统:
sudo mkfs -t ext4 /dev/sdb1:在分区/dev/sdb1上创建 ext4 文件系统。- 其他常见类型:
ext3,xfs,btrfs,vfat(FAT32) 等。
4. 磁盘检验
fsck:检查和修复文件系统错误。通常在文件系统未挂载时运行(如使用 Live CD 或挂载为只读)。例如:sudo fsck /dev/sda1。
5. 磁盘挂载与卸除
- 挂载:
mount [-t 类型] 设备 挂载点sudo mount /dev/sdb1 /mnt/data:将分区/dev/sdb1挂载到目录/mnt/data。- 系统启动时自动挂载:在
/etc/fstab文件中配置。
- 卸除:
umount 设备或挂载点sudo umount /mnt/data或sudo umount /dev/sdb1。
第八部分:Linux 管道命令 (文本处理利器)
管道 | 允许将前一个命令的输出作为后一个命令的输入,常用于文本处理流水线。
wc- 统计字数wc [选项] 文件:统计行数、单词数、字节数。-l:只统计行数。-w:只统计单词数。-c:只统计字节数。- 例如:
cat file.txt | wc -l(统计文件行数)。
cut- 列选取命令cut [选项] [文件]:从文件的每一行中剪切指定的列(字段)。-d '分隔符':指定字段分隔符(默认是 tab)。-f n:指定要提取的第 n 个字段(如-f 1第一个字段,-f 1,3第一和第三)。- 例如:
cut -d ':' -f 1 /etc/passwd(提取所有用户名)。
grep- 行选取命令 如前所述,用于搜索包含模式的行。sort- 排序sort [选项] [文件]:对文本行进行排序。-n:按数值排序(而非字符串)。-r:逆序排序。-k n:按第 n 个字段排序(需配合-t)。-t '分隔符':指定字段分隔符。- 例如:
sort -t ':' -k 3 -n /etc/passwd(按用户 ID 排序)。
uniq- 去重uniq [选项] [输入文件 [输出文件]]:报告或忽略重复的行(通常需要先sort)。-c:在每行前加上该行重复出现的次数。-d:仅显示重复的行。-u:仅显示不重复的行。- 例如:
sort names.txt | uniq -c(统计每个名字出现的次数)。
tee- 同时输出多个文件命令 | tee [选项] 文件:读取标准输入,同时将内容写入标准输出和一个或多个文件。常用于需要查看中间结果并保存时。-a:追加到文件而非覆盖。
tr- 替换指定的字符tr [选项] 字符集1 字符集2:从标准输入进行字符替换、删除或压缩。tr 'a-z' 'A-Z':将所有小写字母转换为大写。tr -d '\n':删除所有换行符。
join- 文件按行连接join [选项] 文件1 文件2:基于两个文件中共同的字段(默认为第一个字段)连接行。类似 SQL 的 JOIN。paste- 将多个文件对应行链接在一起paste [选项] 文件1 文件2 ...:将多个文件按行合并,默认用 tab 分隔。-d '分隔符':指定分隔符。
split- 文件切割split [选项] 输入文件 [输出文件前缀]:将大文件切割成小文件。-l 行数:按行数切割。-b 大小:按字节数切割(如-b 10M)。
xargs- 参数代换命令 | xargs [选项] [命令]:从标准输入读取参数,并构建命令行来执行后续命令。解决find -exec参数过多或命令不支持管道输入的问题。-I {}:指定替换字符串(如find . -name "*.bak" | xargs -I {} rm {})。-n 数量:每次执行命令时使用的最大参数数量。
第九部分:Shell 编程入门
Shell 脚本本质上是包含一系列 Shell 命令的文本文件,可以自动化任务。
1. 运行 Shell 脚本
- 给脚本添加可执行权限:
chmod +x myscript.sh - 运行:
- 指定解释器:
bash myscript.sh - 直接运行:
./myscript.sh(需要可执行权限和正确的#!/bin/bashShebang)
- 指定解释器:
2. 编写 Shell 脚本
- 第一行通常是 Shebang:
#!/bin/bash(指定使用 bash 解释器)。 - 使用文本编辑器(如 Vim, Nano)编写命令。
- 一个快捷创建 shell 脚本的命令:
cat > myscript.sh << 'EOF' ... EOF或直接使用编辑器。
3. echo 命令
- 输出文本到屏幕。
- 显示换行:
echo -e "Line1\nLine2"(-e启用转义)。 - 显示不换行:
echo -n "Text without newline"。
4. printf 命令
提供更精细的格式化输出控制(类似 C 语言的 printf)。
5. Shell 注释
- 单行注释:以
#开头。 - 多行注释:可以用
: << 'COMMENT' ... COMMENT或<< 'EOF' ... EOF(但需注意避免嵌套)。
6. Shell 变量
- 定义变量:
变量名=值(等号两边不能有空格!),如name="Alice"。 - 使用变量:
$变量名或${变量名},如echo $name。 - 只读变量:
readonly 变量名或declare -r 变量名,之后不能修改。 - 删除变量:
unset 变量名。 - 变量类型: Shell 变量通常默认为字符串。整数运算需特殊处理(如
$((表达式)))。 - 环境变量: 使用
export 变量名将当前 shell 的变量导出为环境变量,使其对子进程可见(如export PATH=/new/path:$PATH)。 - 查看环境变量:
printenv或env。
7. Shell 函数
- 定义:
或function_name() { # 函数体 commands }function function_name { commands } - 调用:
function_name [参数1] [参数2] ... - 函数内部使用
$1,$2... 获取参数,$0是脚本名,$#是参数个数,$@是所有参数列表。
8. 文件包含
在脚本中使用 source 或 . (点) 命令包含其他脚本:
source other_script.sh. other_script.sh被包含脚本中的变量和函数在当前脚本中可用。
9. Shell 数据类型
- 字符串: 主要类型。可用单引号
'(强引用,不解释变量和转义) 或双引号"(弱引用,解释变量和部分转义)。 - 数组:
- 定义数组:
array_name=(value1 value2 value3 ...) - 读取数组:
${array_name[index]} - 获取数组的长度:
${#array_name[@]}或${#array_name[*]}(元素个数)
- 定义数组:
10. Shell 传递参数
脚本内部通过特殊变量获取命令行参数:
$0:脚本名称。$1,$2, ...$9:第 1 到第 9 个参数。$#:参数个数。$@:所有参数的列表(每个参数是独立的字符串)。$*:所有参数构成的单个字符串。$$:当前脚本的进程 ID (PID)。$?:上一条命令的退出状态(0 通常表示成功)。
11. Shell 基本运算符
- 算术运算符:
+,-,*,/,%(取模)。运算需放在$(( ))中,如result=$((a + b))。 - 关系运算符:
-eq(等于),-ne(不等于),-gt(大于),-lt(小于),-ge(大于等于),-le(小于等于)。用于数字比较。 - 布尔运算符:
!(非),-o(或),-a(与)。用于连接测试条件。 - 逻辑运算符:
&&(逻辑与),||(逻辑或)。用于连接命令(基于上条命令的退出状态$?)。 - 字符串运算符:
=(相等),!=(不等),-z(长度为零),-n(长度非零)。 - 文件测试运算符:
-e(存在),-f(普通文件),-d(目录),-r(可读),-w(可写),-x(可执行),-s(非空文件) 等。
12. test 命令
test 命令或 [ ] (方括号) 用于条件判断(运算符在 test 内部使用)。
- 数值测试:
[ $a -eq $b ] - 字符串测试:
[ "$str1" = "$str2" ] - 文件测试:
[ -f "file.txt" ]
13. Shell 流程控制
if else判断语句:if [ condition ]; then commands elif [ other_condition ]; then other_commands else else_commands fifor循环:
或for var in list; do commands donefor (( i=0; i<10; i++ )); do commands donewhile循环:while [ condition ]; do commands done- 无限循环:
while :; do ... done或while true; do ... done until循环: 与while相反,条件为假时执行。until [ condition ]; do commands donecase多分支选择:case $variable in pattern1) commands1 ;; pattern2) commands2 ;; *) default_commands ;; esac- 跳出循环:
break:跳出当前循环。break n:跳出 n 层循环。continue:跳过本次循环剩余部分,进入下一次迭代。
14. Shell 输入/输出重定向
如前所述,>, >>, <, |。还支持:
- Here Document:
命令 << 标记 ... 标记将标记之间的文本作为命令的标准输入。 /dev/null文件: 特殊设备文件,写入它的内容会被丢弃,读取它立即得到 EOF。常用于屏蔽输出或输入(如command > /dev/null 2>&1屏蔽所有输出)。
15. 实例
- 杨辉三角: 使用双重循环和数组计算输出。
sum()&max(): 编写函数计算数组元素和或最大值。- 99 乘法表: 使用双重循环打印。
第十部分:文本编辑命令 (进阶处理)
1. cut 命令
如前所述,用于列提取。
2. sed 命令 (流编辑器)
sed [选项] '命令' 文件 或 sed [选项] -e '命令1' -e '命令2' ... 文件。非交互式流编辑器,用于文本替换、删除、插入等。
- 元字符集: 支持正则表达式。
- 基本编辑命令:
a\文本:在当前行后追加一行或多行文本。i\文本:在当前行前插入一行或多行文本。d:删除模式空间中的行(不输出)。c\文本:用指定的文本替换选定的行。p:打印模式空间中的行(通常与-n选项连用,只显示处理过的行)。s/模式/替换字符串/[标志]:字符串替换(最常用)。标志:g(全局替换),i(忽略大小写)。y/源字符集/目标字符集/:字符转换(类似tr)。
- 地址: 指定操作的行范围(行号或模式匹配)。如
1,5d(删除 1-5 行),/pattern/d(删除匹配行)。 - 模式空间 & 保持空间:
sed有两个缓冲区。常用命令h,H(复制/追加模式空间到保持空间),g,G(复制/追加保持空间到模式空间),x(交换)。 - 选项:
-n:抑制默认输出。-e '脚本':指定多个编辑命令。-f 脚本文件:从文件读取sed脚本。-i[后缀]:直接修改文件内容(危险!建议先测试)。可指定备份后缀(如-i.bak)。
3. awk 命令 (文本分析工具)
awk [选项] '模式 {动作}' 文件 或 awk -f 脚本文件 文件。功能强大的文本处理和数据提取语言。
- 基本用法: 逐行扫描文件,对符合
模式的行执行动作。默认按空格或 tab 分割字段。{print $0}:打印整行。{print $1}:打印第一个字段。{print $1, $3}:打印第一和第三字段(用空格分隔)。{print NR, $0}:打印行号和整行。
-F指定分割字符:awk -F':' '{print $1}' /etc/passwd(按冒号分割)。-v设置变量:awk -v name="value" '...'。-f指定 awk 脚本: 将awk程序保存在文件中使用。- AWK 工作原理: 自动将输入分割成记录(通常是行)和字段(列)。内置变量:
NR:当前已读的记录数(行号)。NF:当前记录的字段数。FS:输入字段分隔符(默认空格)。OFS:输出字段分隔符(默认空格)。RS:输入记录分隔符(默认换行)。ORS:输出记录分隔符(默认换行)。FILENAME:当前处理的文件名。
- 运算符: 支持算术、关系、逻辑、赋值、条件等运算符。
- 输出:
- 顺序号 NR, 匹配文本行号:
awk '/pattern/ {print NR, $0}' file。 - 指定输出分割符:
awk 'BEGIN {OFS=","} {print $1, $2}' file。 - 忽略大小写:
awk 'BEGIN{IGNORECASE=1} /pattern/' file(GNU awk)。
- 顺序号 NR, 匹配文本行号:
- 正则字符串匹配: 模式中可使用正则表达式
/regex/。 - 实例:
- 统计日志中不同状态码出现次数:
awk '{count[$9]++} END {for (code in count) print code, count[code]}' access.log。 - 计算文件每行数字的平均值:
awk '{sum=0; for (i=1; i<=NF; i++) sum+=$i; print sum/NF}' data.txt。
- 统计日志中不同状态码出现次数:
- AWK 编程:
- 条件语句:
if (condition) action1 [else action2]。 - 循环语句:
for (initialization; condition; increment) actionwhile (condition) action
- 数组: 支持关联数组(下标可以是字符串)。
array[index] = value,for (key in array) ...。 - 用户自定义函数:
function name(parameter-list) { statements }。 - 内置函数:
- 算数函数:
int(),rand(),srand(),sin(),cos(), ... - 字符串函数:
length(),index(),substr(),split(),gsub(),match(), ... - 时间函数:
systime(),strftime()。 - 位操作函数:
and(),or(),xor(),lshift(),rshift()。 - 其他函数:
system()(执行外部命令),getline(读取下一行)。
- 算数函数:
- 条件语句:
第十一部分:Vim 全套笔记
1. 什么是 vim?
Vim (Vi IMproved) 是 vi 文本编辑器的增强版,功能强大,可高度定制。以其模式化编辑和键盘操作为核心,学习曲线陡峭但效率极高。
2. Vim 的三种模式
- 命令模式 (Normal mode):启动 Vim 后的默认模式。用于移动光标、删除、复制、粘贴、搜索等操作。按
ESC键可从其他模式退回命令模式。 - 输入模式 (Insert mode):用于输入文本。从命令模式进入:
i:在当前光标处插入。I:在当前行首插入。a:在当前光标后插入。A:在当前行尾插入。o:在当前行下方新开一行插入。O:在当前行上方新开一行插入。
- 底行模式 (Last line mode 或 Ex mode):在命令模式下按
:冒号进入。用于保存 (:w)、退出 (:q)、强制操作 (:q!)、查找替换 (:s)、设置选项 (:set) 等。
3. Vim 基础操作 (命令模式下)
- 移动光标:
h(左),j(下),k(上),l(右)。w(下一个单词词首),e(单词词尾),b(上一个单词词首)。0(行首),$(行尾)。gg(文件首行),G(文件尾行),nG(跳转到第 n 行)。Ctrl + f(下一页),Ctrl + b(上一页)。
- 删除操作:
x:删除光标处字符。dw:删除光标到词尾。d$或D:删除光标到行尾。dd:删除当前行。ndd:删除从当前行开始的 n 行。
- 撤销 & 复原 & 重复:
u:撤销上一次操作。Ctrl + r:重做(恢复被撤销的操作)。.(点):重复上一次操作。
- 复制 & 粘贴:
yy:复制 (yank) 当前行。yw:复制当前单词。p:粘贴到光标后。P:粘贴到光标前。
- 合成行:
J:将当前行与下一行合并为一行。 - 搜索替换:
/模式:向下搜索模式(正则)。?模式:向上搜索模式。n:查找下一个匹配项。N:查找上一个匹配项。:s/old/new/g:替换当前行所有old为new。:%s/old/new/g:替换整个文件所有old为new。:%s/old/new/gc:替换前确认。
4. 底行命令模式的常用操作
:w:保存文件。:w 文件名:另存为。:q:退出(未修改时)。:q!:强制退出,不保存修改。:wq或:x:保存并退出。:set nu:显示行号。:set nonu:隐藏行号。:set hlsearch:高亮显示搜索结果。:noh:临时关闭搜索结果高亮。:vsp 文件名:垂直分割窗口打开文件。:sp 文件名:水平分割窗口打开文件。Ctrl + w w:在窗口间切换。:e 文件名:在当前窗口打开新文件。
5. 可视模式 (Visual mode)
在命令模式下按 v (字符可视), V (行可视), Ctrl + v (块可视) 进入。用于选择文本区域,然后执行操作(如删除 d, 复制 y, 缩进 >/< 等)。
第十二部分:Linux 系统启动过程
- 加载内核: BIOS/UEFI 完成自检后,将引导控制权交给引导加载程序(如 GRUB)。引导加载程序加载 Linux 内核(通常为
vmlinuz-*)和初始 RAM 磁盘 (initrd或initramfs) 到内存,并启动内核。内核初始化硬件、检测设备、挂载根文件系统。 - 启动初始化进程: 内核启动第一个用户空间进程,通常是
init(SysV init) 或systemd(现代发行版)。它们的 PID 为 1。 - 确定运行级别 (SysV) 或目标 (systemd):
- SysV init:读取
/etc/inittab确定运行级别 (runlevel)。常见级别:0 (关机), 1 (单用户), 3 (多用户文本), 5 (多用户图形), 6 (重启)。 - systemd:有预定义的 target (如
multi-user.target,graphical.target),相当于运行级别。
- SysV init:读取
- 加载开机启动程序:
- SysV init:运行
/etc/rc.d/rcX.d/(X 为运行级别) 目录下的脚本(S开头启动,K开头停止)。 - systemd:并行启动其 unit 文件(
.service,.target等)定义的依赖服务。
- SysV init:运行
- 用户登录: 启动登录管理器(如
gdm,lightdm用于图形登录,getty用于文本登录)。用户输入凭证后,启动登录 shell (如bash) 和桌面环境 (图形模式)。 - 图形模式与文字模式的切换方式:
Ctrl + Alt + F1到F6:切换到虚拟控制台 (tty1-tty6),通常是文本界面。Ctrl + Alt + F7或F8:通常切换回图形界面 (X server 所在的 tty)。startx:在文本控制台启动图形界面(如果配置允许)。
第十三部分:Linux 关机
如前所述,使用 shutdown, halt, poweroff, reboot 命令,或发送运行级别 init 0 (关机), init 6 (重启)。
第十四部分:计算机启动的流程 (深入)
- 第一阶段:BIOS/UEFI
- 开机自检 (POST)。
- 初始化硬件。
- 查找可引导设备(按 BIOS 设置的顺序)。
- 加载并执行主引导记录 (MBR) 或 GPT 分区表的引导代码 (UEFI 加载 EFI 应用)。
- 第二阶段:主引导记录 (MBR)
- BIOS 将 MBR (磁盘的第一个扇区) 加载到内存并执行。
- MBR 中的代码很小 (512 字节),主要任务是找到活动分区并将该分区的 引导扇区 (Volume Boot Record, VBR) 加载到内存并执行。
- 第三阶段:硬盘启动
- VBR 通常包含一个更强大的引导加载程序(如 GRUB 的第一阶段)的代码,它负责加载引导加载程序的剩余部分(第二阶段)。
- 第四阶段:操作系统
- 引导加载程序(如 GRUB)显示菜单(如有),加载选定的操作系统内核和 initramfs 到内存,并将控制权交给内核。
第十五部分:故障恢复模式
- 单用户模式 (SysV): 在 GRUB 菜单选择内核时按
e编辑,在内核行末尾添加single或1,然后按Ctrl + X启动。以 root 权限进入最小系统环境,用于修复(如修改 root 密码)。 - 修改 CentOS/Ubuntu 系统 root 密码: 利用单用户模式或恢复模式 (Recovery mode) 进入 shell,运行
passwd root设置新密码。 - 救援模式: 使用安装光盘或 USB 启动,选择“Rescue”选项。将根文件系统挂载到
/mnt/sysimage等目录,然后chroot进入进行修复。
第十六部分:虚拟机网络模式
- 桥接模式 (Bridged): 虚拟机通过宿主机的物理网卡直接连接到外部网络,拥有独立的 IP 地址,如同物理机一样。
- NAT 模式 (Network Address Translation): 虚拟机共享宿主机的 IP 地址。宿主机充当路由器,虚拟机通过 NAT 访问外网。外网无法直接访问虚拟机。
- 仅主机模式 (Host-Only): 虚拟机只能和宿主机及其他同模式虚拟机通信,无法访问外网。
第十七部分:常见问题
- 修改静态地址后发现无法 ping 外网: 检查 IP 地址、子网掩码、网关、DNS 配置是否正确;检查防火墙 (
firewalld,iptables) 是否阻止;检查路由 (route -n)。 - 虚拟机克隆后 eth0 消失 (CentOS 6 / Ubuntu 早期): 克隆导致网卡 MAC 地址和 UUID 冲突。解决方法:删除
/etc/udev/rules.d/70-persistent-net.rules(CentOS 6) 或修改/etc/network/interfaces(Ubuntu) 中的 MAC 地址,或使用systemd的.link文件重命名网卡 (现代发行版)。重启网络服务或系统。
第十八部分:特殊权限
除了基本的 rwx 权限,Linux 还有三种特殊权限位:
- SetUID (suid): 设置在可执行文件的用户权限位 (
s代替x)。当普通用户执行此文件时,进程将获得文件所有者的权限(而非执行者的)。例如:/usr/bin/passwd(允许用户修改自己的密码,需要写/etc/shadow的权限)。风险: 如果可执行文件有漏洞,可能被利用提权。 - SetGID (sgid):
- 设置在可执行文件的组权限位 (
s代替x)。当执行此文件时,进程将获得文件所属组的权限。 - 设置在目录上:在该目录下新建的文件或子目录,其所属组将继承该目录的所属组(而非创建者的主组)。常用于协作目录。
- 设置在可执行文件的组权限位 (
- Sticky Bit (sbit) / 粘滞位: 设置在目录的其他权限位 (
t代替x)。在具有粘滞位的目录中,只有文件的所有者、目录的所有者或 root 用户才能删除或重命名文件。即使其他用户有写权限也不行。例如:/tmp目录。防止用户随意删除他人文件。
- 设置: 使用
chmod的数字模式:suid=4,sgid=2,sticky=1。例如:chmod 4755 file(设置 suid),chmod 2770 directory(设置 sgid 到目录),chmod 1777 /tmp(设置粘滞位到 /tmp)。 - 查看:
ls -l查看权限位是否有s或t。
chattr 权限
lsattr:查看特殊权限lsattr [文件]查看文件的扩展属性。chattr:设置特殊权限chattr [选项] 属性 文件。常用属性:+i:文件不可修改(不可删除、改名、更改内容、添加链接)。root 用户可设置。+a:文件只能追加内容(不能修改已有内容或删除)。+A:不更新文件的访问时间 atime。
掩码 umask
umask的作用: 决定新建文件或目录时的默认权限。它是一个八进制数字,表示需要从默认权限中屏蔽掉的权限位。umask是如何改变新文件的权限:- 文件默认权限:
666 - umask(如果结果有执行位,则自动去掉)。 - 目录默认权限:
777 - umask。 - 例如:
umask 022:- 文件:
666 - 022 = 644(rw-r--r--) - 目录:
777 - 022 = 755(rwxr-xr-x)
- 文件:
- 文件默认权限:
- 查看当前 umask:
umask。 - 临时修改 umask:
umask 新值(如umask 027)。 - 永久修改 umask: 将
umask 值添加到用户的 shell 配置文件(如~/.bashrc,~/.profile)或全局配置文件(如/etc/profile,/etc/bash.bashrc)。
第十九部分:Linux 软件安装
1. Ubuntu 软件安装与卸载
- 更新 Ubuntu 软件下载地址: 修改
/etc/apt/sources.list文件,选择更快的软件源镜像。 - Ubuntu 软件操作的相关命令:
sudo apt update:更新软件包索引。sudo apt upgrade:升级所有可升级的软件包。sudo apt install 包名:安装软件包。sudo apt remove 包名:卸载软件包(保留配置文件)。sudo apt purge 包名:卸载软件包并删除配置文件。sudo apt autoremove:自动删除不再需要的依赖包。apt search 关键字:搜索软件包。apt show 包名:显示软件包详细信息。
2. yum 安装命令 (RHEL/CentOS/Fedora)
- 更新国内 yum 源: 替换
/etc/yum.repos.d/目录下的 repo 文件为国内镜像源(如阿里云、清华源)。 - yum 常用命令:
sudo yum makecache:建立缓存。sudo yum update:更新所有包(升级系统)。sudo yum install 包名:安装软件包。sudo yum remove 包名:卸载软件包。sudo yum search 关键字:搜索软件包。sudo yum info 包名:查看软件包信息。sudo yum groupinstall "组名":安装软件包组。
- yum 在线安装 MySQL 5.7:
- 添加 MySQL 官方 yum 仓库。
sudo yum install mysql-community-server。sudo systemctl start mysqld。sudo systemctl enable mysqld。- 获取临时 root 密码:
sudo grep 'temporary password' /var/log/mysqld.log。 mysql_secure_installation进行安全设置。
3. rpm 命令
用于安装、查询、验证、升级和删除 .rpm 软件包。
sudo rpm -ivh package.rpm:安装 RPM 包。rpm -q 包名:查询包是否安装。rpm -qi 包名:查询已安装包的详细信息。rpm -ql 包名:查询包安装的文件列表。sudo rpm -e 包名:卸载包。sudo rpm -Uvh package.rpm:升级包。
第二十部分:Linux 的基本配置
- 安装 JDK:
- 下载 JDK
.tar.gz包。 tar -zxvf jdk-*.tar.gz解压。- 移动到合适目录(如
/usr/local/jdk)。 - 配置环境变量:在
/etc/profile或~/.bashrc中添加:export JAVA_HOME=/usr/local/jdk export PATH=$JAVA_HOME/bin:$PATH source /etc/profile生效。
- 下载 JDK
- 制作本地 YUM 源:
- 将 RPM 包放入一个目录(如
/yum/repo)。 - 安装
createrepo工具。 createrepo /yum/repo创建仓库元数据。- 创建 repo 文件
/etc/yum.repos.d/local.repo:[local] name=Local YUM Repo baseurl=file:///yum/repo enabled=1 gpgcheck=0
- 将 RPM 包放入一个目录(如
- 修改主机名 & IP 地址:
- 主机名: 修改
/etc/hostname文件并重启,或使用hostnamectl set-hostname 新主机名(systemd)。 - IP 地址 (静态):
- CentOS/RHEL 7+:修改
/etc/sysconfig/network-scripts/ifcfg-网卡名或使用nmcli。 - Ubuntu:修改
/etc/netplan/*.yaml文件。
- CentOS/RHEL 7+:修改
- 主机名: 修改
mount挂载: 如前所述,手动挂载或配置/etc/fstab自动挂载。ssh免密登陆:- 本地生成密钥对:
ssh-keygen -t rsa(默认保存在~/.ssh/id_rsa和~/.ssh/id_rsa.pub)。 - 将公钥
id_rsa.pub内容复制到远程服务器的~/.ssh/authorized_keys文件中。
- 本地生成密钥对:
- 批量添加用户: 编写脚本循环调用
useradd或使用newusers命令(从文件批量创建)。 - 与用户账号有关的系统文件:
/etc/passwd:用户账号信息。/etc/shadow:用户密码信息(加密)。/etc/group:用户组信息。/etc/gshadow:组密码信息。
crontab的使用:crontab -e:编辑当前用户的 cron 计划任务。crontab -l:列出当前用户的 cron 任务。crontab -r:删除当前用户的 cron 任务。- 格式:
分钟 小时 日期 月份 星期 命令。例如:0 2 * * * /path/to/backup.sh(每天凌晨 2 点执行备份)。
locate查找: 快速文件查找工具。使用前需更新数据库:sudo updatedb。which命令: 如前所述,查看命令位置。echo: 输出文本。- 设置或显示环境变量:
export如前所述。 - 修改主机名 & IP 地址: 如前所述。
mount挂载: 如前所述。ssh免密登陆: 如前所述。- 批量添加用户: 如前所述。
- 与用户账号有关的系统文件: 如前所述。
- 实操
crontab的使用: 如前所述。 - 特殊权限: 如前所述(suid, sgid, sticky bit)。
chattr权限: 如前所述。- 掩码
umask: 如前所述。 - linux 软件安装: 如前所述(apt, yum, rpm)。
- Linux 的基本配置: 如前所述(JDK, YUM 源, 主机名, IP, SSH, 用户, cron)。
第二十一部分:Shell 编程 (补充数据类型和实例)
如前所述,包括字符串、数组、函数、参数传递、运算符、流程控制、I/O、实例(杨辉三角、求和、最大值、99乘法表)。
第二十二部分:文本编辑命令 (补充 sed 和 awk)
如前所述,详细讲解了 sed 和 awk 的强大功能和应用场景。
第二十三部分:Vim 全套笔记 (补充模式切换和多行编辑)
如前所述,完整介绍了 Vim 的三种模式、基础操作、命令、底行模式、可视模式。多行编辑,vim 支持,vi 不支持:在可视块模式 (Ctrl + v) 下选择多行,然后按 I 插入或 c 修改,输入内容后按 ESC,修改会应用到所有选中的行。
第二十四部分:Linux 系统启动过程 (补充)
如前所述,详细说明了从 BIOS 到用户登录的完整流程。
第二十五部分:Linux 关机
如前所述。
第二十六部分:计算机启动的流程 (深入)
如前所述,分阶段讲解了 BIOS/UEFI、MBR/GPT、引导加载程序、内核加载的过程。
第二十七部分:故障恢复模式
如前所述,介绍了单用户模式、救援模式以及修改 root 密码的方法。
第二十八部分:虚拟机网络模式
如前所述,解释了桥接、NAT、仅主机三种模式的区别。
第二十九部分:常见问题
如前所述,提供了修改静态 IP 无法上网和虚拟机克隆后网卡消失的解决方案。
Shell 编程补充
字符串处理
字符串拼接直接通过变量连接,无需特殊符号:
str1="Hello"
str2="World"
result=$str1$str2 # 输出 HelloWorld
数组操作
定义数组并遍历元素:
arr=("apple" "banana" "cherry")
for fruit in ${arr[@]}; do
echo $fruit
done
函数与参数传递
函数通过位置参数接收参数,$1表示第一个参数:
function greet {
echo "Hello, $1"
}
greet "Alice" # 输出 Hello, Alice
运算符示例
算术运算使用$(( )):
sum=$((3 + 5)) # 结果为8
流程控制case语句匹配多条件:
case $1 in
"start") echo "Starting...";;
"stop") echo "Stopping...";;
*) echo "Unknown command";;
esac
杨辉三角实例
生成5行杨辉三角:
n=5
for ((i=0; i
文本编辑命令补充
sed 高级应用
替换文件中的文本并备份原文件:
sed -i.bak 's/old/new/g' file.txt
awk 数据处理
统计文件的行数和列数:
awk '{print NF " fields in line " NR}' file.txt
Vim 多行编辑操作
可视块模式
- 按
Ctrl + v进入可视块模式。 - 用方向键选择多行。
- 按
I插入文本或c修改文本。 - 输入内容后按
ESC,更改将应用到所有选中行。
模式切换快捷键
i:插入模式v:可视模式::底行命令模式
Linux 系统启动流程
- BIOS/UEFI:硬件自检并加载引导程序。
- MBR/GPT:读取分区表找到引导加载程序(如GRUB)。
- 内核加载:加载内核镜像并初始化进程(systemd或init)。
- 用户登录:启动登录管理器(如GDM或LightDM)。
关机命令
立即关机:
shutdown -h now
重启:
reboot
计算机启动流程深入
UEFI 阶段
- 替代传统BIOS,支持GPT分区表。
- 直接从EFI分区加载引导程序(如
grubx64.efi)。
内核初始化
- 挂载根文件系统。
- 启动第一个用户态进程(PID 1)。
故障恢复模式
单用户模式
- 在GRUB菜单选择内核并按
e编辑。 - 在
linux行末尾添加single或init=/bin/bash。 - 按
Ctrl + x启动进入单用户模式。
修改root密码
在救援模式下执行:
passwd root
虚拟机网络模式
桥接模式
虚拟机直接使用物理网络,独立IP,可被局域网访问。
NAT模式
虚拟机共享主机IP,外部无法直接访问虚拟机。
仅主机模式
虚拟机与主机私有网络通信,隔离外部网络。
常见问题解决
静态IP无法上网
检查网关和DNS配置:
ip route show # 验证网关
cat /etc/resolv.conf # 检查DNS
克隆虚拟机后网卡消失
删除旧网卡配置并重新生成MAC地址:
rm -f /etc/udev/rules.d/70-persistent-net.rules
结语: Linux 是一个庞大而强大的操作系统生态系统。本文提纲挈领地介绍了从历史背景、基础操作、系统管理到高级 Shell 编程和文本处理的核心知识。掌握这些内容将为您的 Linux 之旅打下坚实基础。实践是学习 Linux 的最佳途径,建议在安全的环境(如虚拟机)中多加练习。祝您学习愉快!
浙公网安备 33010602011771号