UNIX系统复习-1

这是我复习《UNIX系统》这门课程时记录的一些笔记 ,希望能对你有所帮助😊

ed 编辑器

ed 是 UNIX 系统中最古老的行编辑器之一,虽然现在使用较少,但了解它的用法对于理解 UNIX 历史和许多现代编辑器的工作原理很有帮助。以下是 ed 编辑器的详细用法和实例。

基本操作

启动和退出 ed

1
2
3
4
5
6
7
$ ed                 # 启动 ed 编辑器
a # 进入输入模式
这是第一行文本
这是第二行文本
. # 退出输入模式
w test.txt # 保存到文件
q # 退出 ed

常用命令

  1. a - 追加文本

    1
    2
    3
    a
    这是追加的文本
    .
  2. i - 插入文本

    1
    2
    3
    1i                 # 在第一行前插入
    这是插入的文本
    .
  3. p - 打印行

    1
    1,3p              # 打印1-3
  4. d - 删除行

    1
    2d                # 删除第2行
  5. w - 写入文件

    1
    w filename        # 保存到文件
  6. q - 退出

    1
    q                 # 退出编辑器

实用示例

示例1:创建和编辑文件

1
2
3
4
5
6
7
8
9
$ ed
a # 开始输入
Hello, world!
This is line 2.
Line 3 here.
. # 结束输入
1,3p # 查看所有内容
w hello.txt # 保存
q # 退出

示例2:编辑现有文件

1
2
3
4
5
6
7
8
$ ed existing.txt
1,3p # 查看前3行
2d # 删除第2行
a # 追加新内容
New line added
.
w # 保存更改
q # 退出

示例3:搜索和替换

1
2
3
4
5
6
7
8
$ ed document.txt
1,$p # 查看所有内容
/pattern/ # 搜索"pattern"
s/old/new/ # 替换当前行的第一个"old""new"
s/old/new/g # 替换当前行所有"old""new"
1,$s/old/new/g # 全局替换
w # 保存
q # 退出

示例4:使用行号编辑

1
2
3
4
5
6
7
8
9
10
11
12
$ ed data.txt
3 # 移动到第3行
p # 打印当前行
a # 在第3行后追加
Additional info
.
2,4p # 查看2-4行
5i # 在第5行前插入
Inserted line
.
w # 保存
q # 退出

高级功能

正则表达式搜索

1
2
/^[A-Z]/            # 搜索以大写字母开头的行
/[0-9]$/ # 搜索以数字结尾的行

全局命令

1
2
3
g/pattern/p         # 打印所有包含pattern的行
g/pattern/d # 删除所有包含pattern的行
v/pattern/p # 打印所有不包含pattern的行

标记位置

1
2
kx                  # 用字母x标记当前位置
'x # 返回标记x的位置

合并文件

1
2
$ ed main.txt
r other.txt # 将other.txt内容读入当前文件

实际应用场景

场景1:批量替换文本

1
2
3
4
$ ed config.cfg
1,$s/192.168.1.1/10.0.0.1/g
w
q

场景2:提取特定行

1
2
3
4
$ ed logfile.log
1,10p # 查看前10行
5,7w extract.txt # 将5-7行保存到extract.txt
q

场景3:快速编辑脚本

1
2
3
4
5
6
$ ed script.sh
/function_name/ # 找到函数定义
.,+5p # 查看函数及其后5行
.,+5s/old/new/g # 替换函数内的文本
w
q

注意事项

  1. ed 是行编辑器,没有全屏界面,所有操作基于命令
  2. 命令区分大小写
  3. 点(.)单独一行表示结束输入模式
  4. 如果不保存就退出,会丢失所有更改
  5. 错误操作可能导致数据丢失,建议经常保存

虽然 ed 编辑器在现代环境中使用较少,但了解它的基本操作对于理解 UNIX 哲学和许多现代文本处理工具的历史发展很有帮助。

文件操作

文件操作命令

1. mv - 移动或重命名文件

基本语法:

1
2
mv [选项] 源文件 目标文件
mv [选项] 源文件... 目标目录

常用选项:

  • -i: 交互式操作,覆盖前提示
  • -f: 强制覆盖,不提示
  • -n: 不覆盖已存在文件
  • -v: 显示详细操作信息

示例:

1
2
3
4
5
mv file.txt newname.txt          # 重命名文件
mv file.txt ~/Documents/ # 移动文件到目录
mv -i old.txt new.txt # 交互式重命名
mv *.txt text_files/ # 移动所有txt文件到目录
mv -v file1 file2 dir/ # 显示详细移动信息

2. cp - 复制文件

基本语法:

1
2
cp [选项] 源文件 目标文件
cp [选项] 源文件... 目标目录

常用选项:

  • -i: 交互式复制
  • -r/-R: 递归复制目录
  • -p: 保留文件属性(权限、时间戳等)
  • -a: 归档模式,相当于-dpR
  • -v: 显示详细操作信息

示例:

1
2
3
4
5
cp file.txt file_backup.txt      # 复制文件
cp -r dir1/ dir2/ # 递归复制目录
cp -p file.txt backup/ # 保留属性复制
cp -a project/ backup/ # 完全复制目录结构
cp *.txt text_backup/ # 复制所有txt文件

3. rm - 删除文件

基本语法:

1
rm [选项] 文件...

常用选项:

  • -i: 交互式删除
  • -f: 强制删除,不提示
  • -r/-R: 递归删除目录
  • -v: 显示详细操作信息

示例:

1
2
3
4
rm file.txt                     # 删除文件
rm -i *.tmp # 交互式删除tmp文件
rm -rf old_dir/ # 强制递归删除目录(慎用)
rm -v *.log # 显示删除的日志文件

文本处理命令

4. wc - 统计文本信息

基本语法:

1
wc [选项] 文件...

常用选项:

  • -l: 只统计行数
  • -w: 只统计单词数
  • -c: 只统计字节数
  • -m: 只统计字符数
  • -L: 显示最长行的长度

示例:

1
2
3
4
5
wc file.txt                     # 显示行数、单词数、字节数
wc -l *.log # 统计所有日志文件行数
wc -w report.txt # 统计文件单词数
wc -L longfile.txt # 找出最长行的长度
cat file.txt | wc -c # 统计字节数(管道用法)

5. grep - 文本搜索

基本语法:

1
grep [选项] 模式 文件...

常用选项:

  • -i: 忽略大小写
  • -v: 反向匹配(显示不匹配的行)
  • -n: 显示行号
  • -c: 统计匹配行数
  • -r/-R: 递归搜索目录
  • -l: 只显示匹配的文件名
  • -E: 使用扩展正则表达式(等同于egrep)
  • -A n: 显示匹配行及其后n行
  • -B n: 显示匹配行及其前n行
  • -C n: 显示匹配行及其前后各n行

示例:

1
2
3
4
5
6
grep "error" logfile.txt        # 搜索包含error的行
grep -i "warning" *.log # 忽略大小写搜索warning
grep -rn "main()" src/ # 递归搜索并显示行号
grep -c "success" report.txt # 统计匹配行数
grep -v "^#" config.cfg # 显示不以#开头的行(过滤注释)
grep -E "[0-9]{3}-[0-9]{4}" data.txt # 使用正则表达式搜索电话号码

6. sort - 排序文本

基本语法:

1
sort [选项] 文件...

常用选项:

  • -n: 按数值大小排序
  • -r: 逆序排序
  • -k n: 按第n列排序
  • -t c: 指定列分隔符为c
  • -u: 去除重复行
  • -f: 忽略大小写
  • -o 文件: 将结果输出到指定文件

示例:

1
2
3
4
5
sort names.txt                  # 按字母顺序排序
sort -nr numbers.txt # 按数值逆序排序
sort -t: -k3 -n /etc/passwd # 按:分隔的第3列(UID)数值排序
sort -u data.txt # 去重排序
sort -k2,2 -k1,1r employees.txt # 先按第2列升序,再按第1列降序

7. cmp - 比较文件差异(二进制)

基本语法:

1
cmp [选项] 文件1 文件2

常用选项:

  • -l: 显示所有不同字节的位置和值
  • -s: 静默模式,只返回退出状态
  • -i n: 跳过前n个字节
  • -n count: 最多比较count个字节

示例:

1
2
3
4
cmp file1.bin file2.bin         # 基本比较
cmp -l image1.jpg image2.jpg # 显示所有差异字节
cmp -s old new && echo "相同" || echo "不同" # 脚本中检查文件是否相同
cmp -i 1024 a.out b.out # 跳过前1024字节比较

8. diff - 比较文件差异(文本)

基本语法:

1
2
diff [选项] 文件1 文件2
diff [选项] 目录1 目录2

常用选项:

  • -c: 上下文格式输出
  • -u: 统一格式输出
  • -i: 忽略大小写
  • -w: 忽略空白差异
  • -r: 递归比较目录
  • -q: 只报告文件是否不同
  • -y: 并排格式输出
  • -a: 将文件视为文本文件(即使看似二进制)

示例:

1
2
3
4
5
diff file1.txt file2.txt        # 基本比较
diff -u old.c new.c > patch.diff # 生成补丁文件
diff -r dir1/ dir2/ # 递归比较目录
diff -iw config.cfg config.bak # 忽略大小写和空白比较
diff -y left.txt right.txt # 并排显示差异

组合使用示例

  1. 统计当前目录下所有.py文件的行数:

    1
    wc -l *.py
  2. 查找包含”TODO”的Python文件并显示行号:

    1
    grep -n "TODO" *.py
  3. 按文件大小排序当前目录下的文件:

    1
    ls -l | sort -nk5
  4. 比较两个目录的差异并生成补丁:

    1
    diff -Nur original/ modified/ > changes.patch
  5. 查找并删除所有临时文件:

    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 命令,显示当前用户名(如 rootuser
    • `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:...追加路径到 PATHPATH=$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 编译默认生成)。

权限的字母与数字表示

权限字母表示数字表示(八进制)
可读r4
可写w2
可执行x1
无权限-0
  • 示例 rwxr-xr-x 的数字表示:
    • 所有者:rwx = 4+2+1 = 7
    • 组:r-x = 4+0+1 = 5
    • 其他用户:r-x = 5
    • 合并为 **755**(常用权限)

扩展命令

如果想修改权限或所有者:

1
2
3
4
5
6
7
8
9
chmod 755 a.out # 修改权限为 755

chmod –w a.out # 移除文件 a.out 的所有写权限(w),即禁止任何用户修改该文件

chmod +x ldir # 为文件或目录 ldir 添加 所有用户的执行权限(x)

sudo chown newuser a.out # 修改所有者为 newuser

sudo chgrp newgroup a.out # 修改所属组为 newgroup

设备文件

Everything is a File

UNIX/Linux 系统的一个核心设计思想是 “一切皆文件”(Everything is a File),包括硬件设备(如键盘、鼠标、磁盘、终端等)也被抽象为文件,存放在 /dev 目录下。这使得用户和程序可以通过标准的文件操作(如 readwriteopenclose)来与设备交互,而无需关心底层硬件细节。


1. 设备文件的分类

在 UNIX/Linux 中,设备文件主要分为两类:

(1) 字符设备(Character Devices)

  • 特点:以字符流方式逐字节传输数据,适用于非块存储设备(如键盘、鼠标、串口、终端等)。

  • 示例

    1
    2
    $ ls -l /dev/ttyS0  # 串口设备
    crw-rw---- 1 root dialout 4, 64 Oct 10 10:00 /dev/ttyS0
    • c 表示字符设备,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/sda
    • b 表示块设备,8 是主设备号,0 是次设备号。

2. 设备号(Major & Minor Numbers)

每个设备文件都有两个关键数字:

  • 主设备号(Major Number):标识设备类型(如 4 表示终端设备,8 表示 SCSI 磁盘)。
  • 次设备号(Minor Number):标识具体设备实例(如 /dev/sda1/dev/sda2 是同一硬盘的不同分区)。

查看设备号:

1
2
$ ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 Oct 10 10:00 /dev/sda # 主设备号=8,次设备号=0

3. 设备文件的创建与管理

(1) 手动创建设备文件(mknod

1
2
$ sudo mknod /dev/mydevice c 123 0  # 创建字符设备,主设备号=123,次设备号=0
$ sudo chmod 666 /dev/mydevice # 设置权限,允许读写

(2) 动态设备管理(udev

现代 Linux 使用 udev 动态管理 /dev 目录,设备插拔时自动创建/删除设备文件:

1
$ udevadm monitor  # 监控设备事件

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
$ cat /etc/passwd > /dev/null  # 数据被丢弃,不显示

(3) 随机数设备(/dev/random & /dev/urandom

  • **/dev/random**:阻塞式随机数生成(熵耗尽时等待)。
  • **/dev/urandom**:非阻塞式随机数生成(速度更快)。
1
$ head -c 16 /dev/urandom | base64  # 生成 16 字节随机 Base64 字符串

(4) 磁盘设备(/dev/sd*

直接读写磁盘(需 root 权限):

1
$ sudo dd if=/dev/sda of=disk_backup.img bs=4M  # 备份整个磁盘

5. 设备文件与普通文件的区别

特性普通文件设备文件
存储方式存储在磁盘上无实际存储,直接映射到设备驱动
读写操作由文件系统管理由内核设备驱动处理
文件类型-(普通文件)c(字符设备)或 b(块设备)
示例/etc/passwd/dev/sda, /dev/tty1

6. 高级应用

(1) 重定向到设备

1
$ cat myfile.txt > /dev/pts/1  # 将文件内容发送到另一个终端

(2) 设备文件与管道结合

1
2
$ tar -czf - /home | ssh user@host "cat > /dev/sdc1/home_backup.tar.gz"
# 压缩 /home 并直接写入远程硬盘

(3) 调试设备

1
2
$ sudo strace -e open,read,write cat /dev/input/mouse0
# 监控鼠标设备的读写操作

7. 安全注意事项

  • **/dev/kmem/dev/mem**:直接访问内核内存,危险!
  • **/dev/sd***:误操作可能导致数据丢失(如 dd if=/dev/zero of=/dev/sda 会清空硬盘)。
  • 权限管理:默认设备文件权限较严格(如 /dev/sda 仅 root 可写),避免随意修改。

总结

UNIX 的设备文件机制使得硬件管理变得极其灵活,用户可以通过文件操作直接控制设备。理解 /dev 目录的结构和设备号(Major/Minor)有助于进行系统调试、驱动开发和自动化管理。


UNIX系统复习-1
http://pzhwuhu.github.io/2025/05/27/UNIX系统复习-1/
本文作者
pzhwuhu
发布于
2025年5月27日
更新于
2025年5月30日
许可协议