跳转至

第3章:文本文件处理

一、基础概念

1. Linux中的文本信息

PPT明确指出,Linux系统中“文本”具有极其广泛和核心的地位,不仅限于人类可读的文档,而是贯穿整个系统架构与应用开发的基础数据形式。

  • 文本文件类型
  • 编程语言源代码:如 C 语言(.c)、Java(.java)等源程序文件,本质上是纯文本。
  • 文本格式的数据文件:例如 CSV、JSON(在未压缩状态下)、配置数据等,便于程序读写和人工检查。
  • 文字信息:包括日志文件(如 /var/log/ 下的日志)、邮件内容、用户文档等。
  • 系统配置信息:集中体现在 /etc 目录下的各类配置文件(如 passwdfstabssh/sshd_config 等),PPT特别强调其功能“类似 Windows 的注册表”,但以分散的文本文件形式实现,更透明、可脚本化。

  • 文本型网络协议: PPT指出:“因特网大部分传输层以上的协议是文本型协议”,这体现了 Unix/Linux “一切皆文本”的设计思想在网络通信中的延续。

  • 会话层协议(控制通信会话):
    • HTTP(超文本传输协议)
    • POP3(邮局协议版本3)
    • SMTP(简单邮件传输协议)
    • IMAP(互联网消息访问协议) 这些协议的请求与响应通常为人类可读的 ASCII 文本,便于调试(如使用 telnet 手动交互)。
  • 表示层协议(定义数据格式):
    • HTML(网页结构)
    • XML(可扩展标记语言)
    • MIME(多用途互联网邮件扩展,用于标识内容类型) 这些格式本身也是文本,可直接用文本工具处理(如 grepsedawk)。

该部分内容强调: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 文本处理命令的共性行为与设计理念,为后续学习具体命令提供统一认知框架。

  • 通用行为(所有命令基本遵循):
  • 灵活的输入源:当命令行未指定文件名时(如 wcsort 单独运行),命令自动从标准输入(stdin) 读取数据;指定一个或多个文件名时,则从这些文件依次读取。
  • 多文件支持:多数命令(如 cat file1 file2wc *.txt)可同时处理多个文件,按顺序处理并输出。
  • 统一的输出目标:处理结果一律发送到标准输出(stdout),便于进一步重定向或接入管道。

  • 设计哲学(Unix/Linux 核心思想):

  • 小而专的工具:系统提供大量独立、精巧、功能单一的命令(如 head 只取开头,tr 只转换单字符),每个命令专注于解决一个特定问题。
  • 组合优于集成强烈鼓励用户通过 Shell 的重定向(><)和管道(| 将多个简单命令组合起来完成复杂任务(如 ps -ef | grep nginx | wc -l)。
  • 文本作为通用接口:所有工具默认使用纯文本作为输入/输出格式,使得不同命令之间可以无缝衔接,形成强大的“工具链”。

  • 应用建议(对开发者的重要启示):

  • PPT特别提醒:“应用系统设计时,也应该考虑到这些特点。”
  • 具体建议:程序(如数据库查询工具)应优先考虑直接输出结构化的多列文本(如制表符或空格分隔),而非二进制或封闭格式。这样用户就能直接使用 sortuniqawk 等标准工具进行后续处理,极大提升系统的可组合性和运维效率。

二、基础命令详解

1. more / less:逐屏显示文件

  • 历史背景
  • more:最早由BSD UNIX开发,用于分页显示文本内容。它为用户提供了一种简单的方式来浏览长文件。
  • less:Linux上广泛使用,功能更强大,支持更多高级特性(如回退浏览)。其设计理念是“less is more”,即在提供更多功能的同时保持简洁。

  • 使用方式

  • 直接查看单个文件:more shudu.c
  • 查看多个文件:more *.c *.h
  • 将其他命令输出通过管道传递给morels -l | more
  • 使用less查看文件:less shudu.c

  • 交互操作(more): | 操作 | 描述 | | -------- | ----------------------------------------- | | 空格 | 显示下一屏 | | 回车 | 上滚一行 | | q | 退出程序 | | /pattern | 搜索指定模式的字符串(支持正则表达式) | | h | 打印帮助信息 | | Ctrl-L | 刷新屏幕 |

  • less增强功能

  • 支持上下箭头、j/kPgUp/PgDnHome/End等vi风格导航键
  • 允许回退浏览(more不支持)
  • 在某些Unix系统中,如果less不可用,可以利用more的增强功能来部分替代

2. catod:列出文件内容

  • 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. headtail:显示文件头部或尾部

  • 默认行为:显示前10行或后10行
  • 常用选项
  • -n N:指定显示N行(如head -n 15 ab.c
  • -n -Nhead):排除最后N行显示剩余部分
  • -n +Ntail):从第N行开始到文件末尾
  • -ftail):实时监控文件追加内容(常用于日志文件)
  • 示例
  • 显示特定数量的行: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配合使用,确保相同行相邻以便正确处理
  • 示例输入效果
    Text Only
    1
    2
    3
    4
    5
    6
    7
    Linux
    Windows
    Windows
    Linux
    Linux
    Linux
    AIX
    
    uniq处理后变为:
    Text Only
    1
    2
    3
    4
    Linux
    Windows
    Linux
    AIX
    

以上大纲严格按照提供的PPT内容整理而成,旨在提供清晰、全面的知识框架,涵盖各命令的基本概念、使用方法及其应用场景。