第3章:文本文件处理¶
一、基础概念¶
1. Linux中的文本信息¶
PPT明确指出,Linux系统中“文本”具有极其广泛和核心的地位,不仅限于人类可读的文档,而是贯穿整个系统架构与应用开发的基础数据形式。
- 文本文件类型:
- 编程语言源代码:如 C 语言(
.c)、Java(.java)等源程序文件,本质上是纯文本。 - 文本格式的数据文件:例如 CSV、JSON(在未压缩状态下)、配置数据等,便于程序读写和人工检查。
- 文字信息:包括日志文件(如
/var/log/下的日志)、邮件内容、用户文档等。 -
系统配置信息:集中体现在
/etc目录下的各类配置文件(如passwd、fstab、ssh/sshd_config等),PPT特别强调其功能“类似 Windows 的注册表”,但以分散的文本文件形式实现,更透明、可脚本化。 -
文本型网络协议: PPT指出:“因特网大部分传输层以上的协议是文本型协议”,这体现了 Unix/Linux “一切皆文本”的设计思想在网络通信中的延续。
- 会话层协议(控制通信会话):
- HTTP(超文本传输协议)
- POP3(邮局协议版本3)
- SMTP(简单邮件传输协议)
- IMAP(互联网消息访问协议)
这些协议的请求与响应通常为人类可读的 ASCII 文本,便于调试(如使用
telnet手动交互)。
- 表示层协议(定义数据格式):
- HTML(网页结构)
- XML(可扩展标记语言)
- MIME(多用途互联网邮件扩展,用于标识内容类型)
这些格式本身也是文本,可直接用文本工具处理(如
grep、sed、awk)。
该部分内容强调:Linux 不仅存储文本,而且系统内部通信、外部网络交互、程序开发与配置管理均高度依赖文本格式,为后续介绍文本处理命令提供了根本动因。
2. 进程的标准输入/输出¶
PPT从进程模型出发,阐明了文本流在程序运行时的传递机制,这是理解重定向和管道的前提。
- 标准流:
- 每个进程默认启动时自动关联三个标准 I/O 流:
- 标准输入(stdin,文件描述符 0):默认从键盘读取。
- 标准输出(stdout,文件描述符 1):默认输出到终端屏幕。
-
这些流本质上是“字节流”,在文本处理场景下,内容通常为文本行。
-
重定向机制: PPT通过具体命令示例说明 Shell 如何改变默认 I/O 路径:
- 输出重定向:
ls -l > filelist.txt
将ls -l命令原本输出到屏幕的内容写入filelist.txt文件(覆盖写入)。 -
输入重定向:
sort < filelist.txt
使sort命令从filelist.txt读取输入,而非等待键盘输入。 -
管道机制:
- PPT给出关键示例:
ls -l | sort
将ls -l的标准输出直接作为sort的标准输入,中间不经过临时文件。 -
管道符号
|实现了进程间的匿名 FIFO(先进先出队列),高效传递文本流。 -
重要性: PPT明确指出:“重定向机制和管道机制的重要性”在于它们构成了 Linux 组合式文本处理的核心基础设施。通过这两个机制,用户可以将简单的命令像“乐高积木”一样拼接,构建复杂的数据处理流水线,而无需编写新程序。这是 Unix 哲学“做一件事并做好”的直接体现。
3. 文本文件处理命令的特点¶
PPT在此部分系统总结了 Linux 文本处理命令的共性行为与设计理念,为后续学习具体命令提供统一认知框架。
- 通用行为(所有命令基本遵循):
- 灵活的输入源:当命令行未指定文件名时(如
wc、sort单独运行),命令自动从标准输入(stdin) 读取数据;指定一个或多个文件名时,则从这些文件依次读取。 - 多文件支持:多数命令(如
cat file1 file2、wc *.txt)可同时处理多个文件,按顺序处理并输出。 -
统一的输出目标:处理结果一律发送到标准输出(stdout),便于进一步重定向或接入管道。
-
设计哲学(Unix/Linux 核心思想):
- 小而专的工具:系统提供大量独立、精巧、功能单一的命令(如
head只取开头,tr只转换单字符),每个命令专注于解决一个特定问题。 - 组合优于集成:强烈鼓励用户通过 Shell 的重定向(
>、<)和管道(|) 将多个简单命令组合起来完成复杂任务(如ps -ef | grep nginx | wc -l)。 -
文本作为通用接口:所有工具默认使用纯文本作为输入/输出格式,使得不同命令之间可以无缝衔接,形成强大的“工具链”。
-
应用建议(对开发者的重要启示):
- PPT特别提醒:“应用系统设计时,也应该考虑到这些特点。”
- 具体建议:程序(如数据库查询工具)应优先考虑直接输出结构化的多列文本(如制表符或空格分隔),而非二进制或封闭格式。这样用户就能直接使用
sort、uniq、awk等标准工具进行后续处理,极大提升系统的可组合性和运维效率。
二、基础命令详解¶
1. more / less:逐屏显示文件¶
- 历史背景:
more:最早由BSD UNIX开发,用于分页显示文本内容。它为用户提供了一种简单的方式来浏览长文件。-
less:Linux上广泛使用,功能更强大,支持更多高级特性(如回退浏览)。其设计理念是“less is more”,即在提供更多功能的同时保持简洁。 -
使用方式:
- 直接查看单个文件:
more shudu.c - 查看多个文件:
more *.c *.h - 将其他命令输出通过管道传递给
more:ls -l | more -
使用
less查看文件:less shudu.c -
交互操作(more): | 操作 | 描述 | | -------- | ----------------------------------------- | | 空格 | 显示下一屏 | | 回车 | 上滚一行 | | q | 退出程序 | | /pattern | 搜索指定模式的字符串(支持正则表达式) | | h | 打印帮助信息 | | Ctrl-L | 刷新屏幕 |
-
less增强功能:
- 支持上下箭头、
j/k、PgUp/PgDn、Home/End等vi风格导航键 - 允许回退浏览(
more不支持) - 在某些Unix系统中,如果
less不可用,可以利用more的增强功能来部分替代
2. cat 与 od:列出文件内容¶
cat(concatenate):- 功能:将一个或多个文件的内容输出到标准输出设备(通常是终端屏幕)。
- 常用选项:
-n(显示行号) -
示例:
- 显示单个文件:
cat try1.c - 显示带行号的文件:
cat -n shudu.c - 合并多个文件:
cat file1 file2 > combined - 从标准输入创建新文件:
cat > newfile(完成后按Ctrl-D结束)
- 显示单个文件:
-
od(octal dump): - 功能:以不同的格式(如八进制、十六进制、字符形式)显示文件内容。
- 常用选项:
-t c或-c:显示文件内容为可打印字符(对于非打印字符显示转义序列)-t x1:以十六进制字节形式显示-t d1/-t u1:分别以十进制有符号/无符号字节形式显示
- 示例:
- 以十六进制显示文件内容:
od -t x1 x.dat - 结合管道使用:
echo abcdABCD | od -t x1 - 逐字符显示二进制文件:
od -c /bin/bash
- 以十六进制显示文件内容:
3. head 与 tail:显示文件头部或尾部¶
- 默认行为:显示前10行或后10行
- 常用选项:
-n N:指定显示N行(如head -n 15 ab.c)-n -N(head):排除最后N行显示剩余部分-n +N(tail):从第N行开始到文件末尾-f(tail):实时监控文件追加内容(常用于日志文件)- 示例:
- 显示特定数量的行:
head -n 15 ab.c - 实时监控日志文件:
tail -f debug.txt - 排除最后若干行:
head -n -20 msg.c - 从某行开始显示至末尾:
tail -n +20 msg.c - 组合命令处理:
ls -s | sort | head -n 20
4. tee:同时输出到标准输出和文件¶
- 功能:读取标准输入内容,并将其写入标准输出以及指定的文件中。
- 典型用途:记录程序输出的同时在终端显示,便于调试与记录。
- 示例:
./myapp | tee myapp.log
5. wc(word count):统计文本信息¶
- 统计项:行数、单词数、字符数
- 常用选项:
-l:仅统计行数- 行为特点:
- 对于多文件输入,最后一行会显示总计
- 示例:
- 单文件统计:
wc sum.c - 多文件统计:
wc *.c makefile - 管道结合使用:
ps -ef | wc -l
6. sort:对文件内容排序¶
- 核心功能:根据特定规则对文本文件中的行进行排序。
- 常用选项:
-n:数值排序(而非字符串比较)- 可选择排序关键字字段
- 支持升序/降序排序
- 区分大小写敏感性
- 内排序与外排序算法参数调整(适用于大数据集优化)
- 示例:
- 简单排序:
sort telno > telno1 - 结合其他命令:
ls -s | sort -n | tail -10
7. tr:翻译或替换字符¶
- 基本语法:
tr string1 string2 - 将标准输入中
string1中的每个字符替换为string2对应位置的字符。 - 高级用法:
- 使用字符集转换:
tr '[a-z]' '[A-Z]'(小写字母转大写) - 使用八进制转义序列:
tr '%' '\012'(将百分号替换为换行符) - 注意:必须使用单引号防止Shell解释特殊字符
- 示例:
- 转换大小写:
cat report | tr '[a-z]' '[A-Z]' - 字符替换:
cat file | tr UVX uvx
8. uniq:筛选重复行¶
- 前提:只处理连续重复的行
- 常用选项:
- 默认行为:压缩连续相同的行
-u:仅保留唯一行(无重复)-d:仅保留重复行(每组只输出一次)-c:计算相同行出现次数并在每行前加上计数- 典型用法:通常与
sort配合使用,确保相同行相邻以便正确处理 - 示例输入效果:
经
uniq处理后变为:
以上大纲严格按照提供的PPT内容整理而成,旨在提供清晰、全面的知识框架,涵盖各命令的基本概念、使用方法及其应用场景。