UNIX系统复习-1
这是我复习《UNIX系统》这门课程时记录的一些笔记 ,希望能对你有所帮助😊
ed 编辑器
ed 是 UNIX 系统中最古老的行编辑器之一,虽然现在使用较少,但了解它的用法对于理解 UNIX 历史和许多现代编辑器的工作原理很有帮助。以下是 ed 编辑器的详细用法和实例。
基本操作
启动和退出 ed
1 | |
常用命令
a- 追加文本1
2
3a
这是追加的文本
.i- 插入文本1
2
31i # 在第一行前插入
这是插入的文本
.p- 打印行1
1,3p # 打印1-3行d- 删除行1
2d # 删除第2行w- 写入文件1
w filename # 保存到文件q- 退出1
q # 退出编辑器
实用示例
示例1:创建和编辑文件
1 | |
示例2:编辑现有文件
1 | |
示例3:搜索和替换
1 | |
示例4:使用行号编辑
1 | |
高级功能
正则表达式搜索
1 | |
全局命令
1 | |
标记位置
1 | |
合并文件
1 | |
实际应用场景
场景1:批量替换文本
1 | |
场景2:提取特定行
1 | |
场景3:快速编辑脚本
1 | |
注意事项
- ed 是行编辑器,没有全屏界面,所有操作基于命令
- 命令区分大小写
- 点(.)单独一行表示结束输入模式
- 如果不保存就退出,会丢失所有更改
- 错误操作可能导致数据丢失,建议经常保存
虽然 ed 编辑器在现代环境中使用较少,但了解它的基本操作对于理解 UNIX 哲学和许多现代文本处理工具的历史发展很有帮助。
文件操作
文件操作命令
1. mv - 移动或重命名文件
基本语法:
1 | |
常用选项:
-i: 交互式操作,覆盖前提示-f: 强制覆盖,不提示-n: 不覆盖已存在文件-v: 显示详细操作信息
示例:
1 | |
2. cp - 复制文件
基本语法:
1 | |
常用选项:
-i: 交互式复制-r/-R: 递归复制目录-p: 保留文件属性(权限、时间戳等)-a: 归档模式,相当于-dpR-v: 显示详细操作信息
示例:
1 | |
3. rm - 删除文件
基本语法:
1 | |
常用选项:
-i: 交互式删除-f: 强制删除,不提示-r/-R: 递归删除目录-v: 显示详细操作信息
示例:
1 | |
文本处理命令
4. wc - 统计文本信息
基本语法:
1 | |
常用选项:
-l: 只统计行数-w: 只统计单词数-c: 只统计字节数-m: 只统计字符数-L: 显示最长行的长度
示例:
1 | |
5. grep - 文本搜索
基本语法:
1 | |
常用选项:
-i: 忽略大小写-v: 反向匹配(显示不匹配的行)-n: 显示行号-c: 统计匹配行数-r/-R: 递归搜索目录-l: 只显示匹配的文件名-E: 使用扩展正则表达式(等同于egrep)-A n: 显示匹配行及其后n行-B n: 显示匹配行及其前n行-C n: 显示匹配行及其前后各n行
示例:
1 | |
6. sort - 排序文本
基本语法:
1 | |
常用选项:
-n: 按数值大小排序-r: 逆序排序-k n: 按第n列排序-t c: 指定列分隔符为c-u: 去除重复行-f: 忽略大小写-o 文件: 将结果输出到指定文件
示例:
1 | |
7. cmp - 比较文件差异(二进制)
基本语法:
1 | |
常用选项:
-l: 显示所有不同字节的位置和值-s: 静默模式,只返回退出状态-i n: 跳过前n个字节-n count: 最多比较count个字节
示例:
1 | |
8. diff - 比较文件差异(文本)
基本语法:
1 | |
常用选项:
-c: 上下文格式输出-u: 统一格式输出-i: 忽略大小写-w: 忽略空白差异-r: 递归比较目录-q: 只报告文件是否不同-y: 并排格式输出-a: 将文件视为文本文件(即使看似二进制)
示例:
1 | |
组合使用示例
统计当前目录下所有.py文件的行数:
1
wc -l *.py查找包含”TODO”的Python文件并显示行号:
1
grep -n "TODO" *.py按文件大小排序当前目录下的文件:
1
ls -l | sort -nk5比较两个目录的差异并生成补丁:
1
diff -Nur original/ modified/ > changes.patch查找并删除所有临时文件:
1
find . -name "*.tmp" | xargs rm -v
这些命令是UNIX/Linux系统中最常用的文本处理工具,熟练掌握它们可以极大提高在命令行环境下的工作效率。
环境变量设置
这些命令涉及 Linux/Unix shell 环境变量 的设置和使用,我来逐个解释:
1. PS1=C:\\>
- 作用:修改 shell 的 命令提示符(Prompt String 1)
- 效果:
PS1是控制终端提示符的变量C:\\>表示提示符会显示为C:\>(类似 Windows 的 CMD 风格)
- 示例:
1
2$ PS1=C:\\>
C:\> # 现在提示符变成了这样
2. PS1='whoami:pwd>'
- 作用:自定义提示符,显示 当前用户 + 当前目录
- 解释:
`whoami`:执行whoami命令,显示当前用户名(如root或user)`pwd`:执行pwd命令,显示当前工作目录(如/home/user)- 最终提示符格式:
用户名:当前目录 >
- 示例:
1
2$ PS1='`whoami`:`pwd` >'
user:/home/user > # 提示符变成这样
3. echo $HOME
- 作用:显示当前用户的 家目录(Home Directory)
- 解释:
$HOME是环境变量,存储用户的家目录路径(如/home/user)
- 示例:
1
2$ echo $HOME
/home/user
4. echo $PATH
- 作用:显示 可执行程序的搜索路径
- 解释:
$PATH是环境变量,包含多个目录路径,用:分隔- 当输入命令时,shell 会按
PATH中的顺序查找可执行文件
- 示例:
1
2$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
5. PATH=$PATH:$HOME/bin
作用:将
$HOME/bin添加到PATH环境变量解释:
$PATH:$HOME/bin:在原PATH后追加:$HOME/bin- 这样 shell 也会在
~/bin目录下查找可执行文件
示例:
1
2
3$ PATH=$PATH:$HOME/bin
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/home/user/bin
6. d=/home/lls/c
- 作用:定义一个 **shell 变量
d**,存储路径/home/lls/c - 解释:
d是自定义变量(不是环境变量,仅在当前 shell 有效)- 可以用于后续命令(如
cd $d)
- 示例:
1
2
3$ d=/home/lls/c
$ echo $d
/home/lls/c
7. cd $d
- 作用:切换到变量
d指定的目录 - 解释:
$d会展开为/home/lls/c- 相当于执行
cd /home/lls/c
- 示例:
1
2
3$ cd $d
$ pwd
/home/lls/c
总结
| 命令 | 作用 | 示例 |
|---|---|---|
PS1=... | 设置终端提示符 | PS1='\u:\w $' |
echo $HOME | 显示家目录 | /home/user |
echo $PATH | 显示可执行文件搜索路径 | /usr/bin:/bin |
PATH=$PATH:... | 追加路径到 PATH | PATH=$PATH:~/bin |
var=value | 定义 shell 变量 | d=/home/lls/c |
cd $var | 切换到变量指定的目录 | cd $d |
这些命令常用于 自定义 shell 环境 或 管理文件路径。
文件系统
文件权限
命令 ls -l a.out
- 作用:以长格式(
-l选项)列出文件a.out的详细信息 - 输出示例:
1
-rwxr-xr-x 1 user1 users 9319 2010-02-09 23:56 a.out
输出字段解析
| 字段 | 示例值 | 含义 |
|---|---|---|
| 文件类型和权限 | -rwxr-xr-x | 文件类型 + 所有者/组/其他用户的权限 |
| 硬链接数 | 1 | 指向该文件的硬链接数量 |
| 所有者 | user1 | 文件所有者用户名 |
| 所属组 | users | 文件所属用户组 |
| 文件大小 | 9319 | 文件大小(字节) |
| 最后修改时间 | 2010-02-09 23:56 | 文件最后修改的日期和时间 |
| 文件名 | a.out | 文件名 |
详细拆解
1. 文件类型和权限 (-rwxr-xr-x)
**第一个字符
-**:文件类型-:普通文件d:目录l:符号链接- 其他如
c(字符设备)、b(块设备)等
后续 9 个字符:==权限分 3 组(所有者/组/其他用户==)
rwxr-xr-x分解:- 所有者权限 (
rwx):可读(r)、可写(w)、可执行(x) - 组权限 (
r-x):可读(r)、不可写(-)、可执行(x) - 其他用户权限 (
r-x):同组权限
- 所有者权限 (
2. 硬链接数 (1)
- 表示该文件有 1 个硬链接(即文件名
a.out是唯一指向该文件 inode 的硬链接)。
3. 所有者和组 (user1 users)
- 所有者:用户
user1对该文件有完全控制权(rwx)。 - 所属组:组
users的成员对该文件有读和执行权限(r-x)。
4. 文件大小 (9319)
- 文件占 9319 字节(约 9.1 KB)。
5. 修改时间 (2010-02-09 23:56)
- 文件最后修改时间为 2010 年 2 月 9 日 23:56。
6. 文件名 (a.out)
- 这是一个典型的 可执行文件(由
gcc编译默认生成)。
权限的字母与数字表示
| 权限 | 字母表示 | 数字表示(八进制) |
|---|---|---|
| 可读 | r | 4 |
| 可写 | w | 2 |
| 可执行 | x | 1 |
| 无权限 | - | 0 |
- 示例
rwxr-xr-x的数字表示:- 所有者:
rwx=4+2+1=7 - 组:
r-x=4+0+1=5 - 其他用户:
r-x=5 - 合并为 **
755**(常用权限)
- 所有者:
扩展命令
如果想修改权限或所有者:
1 | |
设备文件
Everything is a File
UNIX/Linux 系统的一个核心设计思想是 “一切皆文件”(Everything is a File),包括硬件设备(如键盘、鼠标、磁盘、终端等)也被抽象为文件,存放在 /dev 目录下。这使得用户和程序可以通过标准的文件操作(如 read、write、open、close)来与设备交互,而无需关心底层硬件细节。
1. 设备文件的分类
在 UNIX/Linux 中,设备文件主要分为两类:
(1) 字符设备(Character Devices)
特点:以字符流方式逐字节传输数据,适用于非块存储设备(如键盘、鼠标、串口、终端等)。
示例:
1
2$ ls -l /dev/ttyS0 # 串口设备
crw-rw---- 1 root dialout 4, 64 Oct 10 10:00 /dev/ttyS0c表示字符设备,4是主设备号,64是次设备号。
(2) 块设备(Block Devices)
特点:以固定大小的数据块(如 512B、4KB)传输,适用于存储设备(如硬盘、SSD、U盘等)。
示例:
1
2$ ls -l /dev/sda # 硬盘设备
brw-rw---- 1 root disk 8, 0 Oct 10 10:00 /dev/sdab表示块设备,8是主设备号,0是次设备号。
2. 设备号(Major & Minor Numbers)
每个设备文件都有两个关键数字:
- 主设备号(Major Number):标识设备类型(如
4表示终端设备,8表示 SCSI 磁盘)。 - 次设备号(Minor Number):标识具体设备实例(如
/dev/sda1和/dev/sda2是同一硬盘的不同分区)。
查看设备号:
1 | |
3. 设备文件的创建与管理
(1) 手动创建设备文件(mknod)
1 | |
(2) 动态设备管理(udev)
现代 Linux 使用 udev 动态管理 /dev 目录,设备插拔时自动创建/删除设备文件:
1 | |
4. 设备文件的使用示例
(1) 终端设备(/dev/pts/*)
/dev/pts/0是当前终端(伪终端),可以直接写入数据:1
$ echo "Hello, terminal!" > /dev/pts/0 # 在当前终端显示消息/dev/tty是当前进程的控制终端:1
$ echo "Hello, tty!" > /dev/tty # 直接输出到当前终端
(2) 空设备(/dev/null)
丢弃所有写入的数据:
1 | |
(3) 随机数设备(/dev/random & /dev/urandom)
- **
/dev/random**:阻塞式随机数生成(熵耗尽时等待)。 - **
/dev/urandom**:非阻塞式随机数生成(速度更快)。
1 | |
(4) 磁盘设备(/dev/sd*)
直接读写磁盘(需 root 权限):
1 | |
5. 设备文件与普通文件的区别
| 特性 | 普通文件 | 设备文件 |
|---|---|---|
| 存储方式 | 存储在磁盘上 | 无实际存储,直接映射到设备驱动 |
| 读写操作 | 由文件系统管理 | 由内核设备驱动处理 |
| 文件类型 | -(普通文件) | c(字符设备)或 b(块设备) |
| 示例 | /etc/passwd | /dev/sda, /dev/tty1 |
6. 高级应用
(1) 重定向到设备
1 | |
(2) 设备文件与管道结合
1 | |
(3) 调试设备
1 | |
7. 安全注意事项
- **
/dev/kmem、/dev/mem**:直接访问内核内存,危险! - **
/dev/sd***:误操作可能导致数据丢失(如dd if=/dev/zero of=/dev/sda会清空硬盘)。 - 权限管理:默认设备文件权限较严格(如
/dev/sda仅 root 可写),避免随意修改。
总结
UNIX 的设备文件机制使得硬件管理变得极其灵活,用户可以通过文件操作直接控制设备。理解 /dev 目录的结构和设备号(Major/Minor)有助于进行系统调试、驱动开发和自动化管理。