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)有助于进行系统调试、驱动开发和自动化管理。