Linux 文本比较与处理工具:comm、uniq、diff、patch、sort 全解析

在类 UNIX 操作系统,特别是 Linux 系统中,命令行提供了一整套强大的文本处理工具,这些工具对于文件差异对比、内容筛选、文本排序以及源代码管理尤为重要。今天,我们将结合真实示例,深入介绍并实战演示 comm、uniq、diff、patch 和 sort 五大命令的用法,深入探讨工具背后的原理和工具间的协作机制,帮助读者更高效地处理文本数据。


一、基础概念与环境准备

在 Linux 中,文本处理工具的设计哲学是“做一件事并做好”,这些工具通常专注于单一功能,但通过管道(|)和重定向(><)等机制组合使用,可以实现复杂的数据处理任务。以下是我们将使用的测试环境和文件准备步骤。

1.1 创建测试环境

为了便于演示,我们首先在用户主目录下创建一个实验目录并生成几个测试文件,分别代表不同的类 UNIX 系统类型:

mkdir -p ~/textcompare && cd ~/textcompare

创建四个测试文件:gnulinuxbsdunix,内容如下:

cat > gnu << EOF
Arch Hurd
Debian GNU/Hurd
Debian GNU/kFreeBSD
Debian GNU/Linux
Guix System
EOFcat > linux << EOF
Debian GNU/Linux
Gentoo
Android
Alpine Linux
OpenWRT
Ubuntu
EOFcat > bsd << EOF
FreeBSD
OpenBSD
GhostBSD
Debian GNU/kFreeBSD
NetBSD
DragonFly BSD
EOFcat > unix << EOF
macOS
AIX
Solaris
OpenBSD
FreeBSD
EOF

这些文件模拟了不同系统发行版的清单,我们将使用它们来演示 communiqdiffpatchsort 的功能。

1.2 工具概览

以下是本文将介绍的五个工具的核心功能概览:

工具主要功能典型应用场景
comm比较两个已排序文件的交集和差异查找文件内容的共有和独有部分
uniq去重、统计重复行日志分析、数据清洗
sort按指定规则排序文本行数据预处理、字段排序
diff比较文件差异并生成补丁版本控制、配置文件对比
patch应用补丁修改文件内容软件更新、配置合并

这些工具的组合使用可以覆盖从简单文本处理到复杂版本控制的多种场景。


二、comm:高效比较两个有序文件的交集与差异

2.1 用法与原理

comm 命令用于比较两个已排序的文本文件,输出结果分为三列:

  • 第一列:仅在第一个文件中出现的行
  • 第二列:仅在第二个文件中出现的行
  • 第三列:两个文件共有的行

comm 的基本语法如下:

comm [OPTION] FILE1 FILE2

注意comm 要求输入文件已排序,因此通常需要配合 sort 命令使用。如果文件未排序,结果可能不准确。

常用选项包括:

  • -1:隐藏第一列(仅 FILE1 的行)
  • -2:隐藏第二列(仅 FILE2 的行)
  • -3:隐藏第三列(共有的行)
  • --check-order:检查输入文件是否已排序
  • --nocheck-order:忽略排序检查

2.2 示例演示

假设我们要比较 gnulinux 文件的内容。首先确保文件已排序,这里使用进程替换将命令执行结果当作一个文件交给 comm:

comm <(sort gnu) <(sort linux)

输出结果(假设以制表符分隔):

        Alpine LinuxAndroid
Arch Hurd
Debian GNU/HurdDebian GNU/Linux
Debian GNU/kFreeBSDGentoo
Guix SystemOpenWRTUbuntu
  • 第一列:仅在 gnu 中出现的内容
  • 第二列:仅在 linux 中出现的内容
  • 第三列:共有的内容

如果只想查看 gnu 独有的内容:

comm -23 <(sort gnu) <(sort linux)

只查看交集:

comm -12 <(sort gnu) <(sort linux)

三、uniq:去重与重复行统计

3.1 用法与原理

uniq 命令用于处理文本中的重复行,通常与 sort 配合使用,因为它只检测连续的重复行。基本语法为:

uniq [OPTION] [INPUT [OUTPUT]]

常用选项:

  • -c:在每行前显示重复次数
  • -d:只输出重复的行
  • -u:只输出不重复的行
  • -i:忽略大小写
  • -f N:忽略每行前 N 个字段
  • -s N:忽略每行前 N 个字符

3.2 示例演示

假设我们将所有测试文件合并为 all.txt

cat gnu linux bsd unix > all.txt

统计每种系统出现的次数:

sort all.txt | uniq -c

输出:

      1 AIX1 Alpine Linux1 Android1 Arch Hurd1 Debian GNU/Hurd2 Debian GNU/Linux2 Debian GNU/kFreeBSD1 DragonFly BSD2 FreeBSD1 Gentoo1 GhostBSD1 Guix System1 NetBSD2 OpenBSD1 OpenWRT1 Solaris1 Ubuntu1 macOS

其中,Debian GNU/kFreeBSD 出现了两次(在 gnubsd 中)。

只显示重复的行:

sort all.txt | uniq -d

输出:

Debian GNU/kFreeBSD
FreeBSD
OpenBSD

四、sort:文本排序的多面手

4.1 用法与原理

sort 命令用于对文本行进行排序,支持多种排序规则。基本语法为:

sort [OPTIONS] [FILE...]

常用选项:

  • -n:按数字排序
  • -r:倒序排序
  • -k:指定排序字段(例如 -k2 表示按第二列排序)
  • -t:指定字段分隔符
  • -f:忽略大小写
  • -u:去重(等同于 sort | uniq
  • -R:随机排序

4.2 示例演示

all.txt 按字典序排序:

sort all.txt

按行长度排序(结合 awk 预处理):

awk '{print length($0), $0}' all.txt | sort -n | awk '{$1=""; print $0}'

输出:

 AIXmacOSGentooNetBSDUbuntuAndroidFreeBSDFreeBSDOpenBSDOpenBSDOpenWRTSolarisGhostBSDArch HurdGuix SystemAlpine LinuxDragonFly BSDDebian GNU/HurdDebian GNU/LinuxDebian GNU/LinuxDebian GNU/kFreeBSDDebian GNU/kFreeBSD

字段排序:对 /etc/passwd 按 UID(第 3 字段)排序:

sort -t: -k3,3n /etc/passwd

五、diff:文件差异分析的利器

5.1 用法与原理

diff 命令用于比较两个文件的差异,输出差异的行或生成补丁文件。基本语法为:

diff [OPTION] FILE1 FILE2

常用选项:

  • -u:生成统一格式(unified format)的补丁
  • -c:生成上下文格式的补丁
  • -y:并排显示差异(side-by-side)
  • -r:递归比较目录
  • --brief:仅报告是否有差异

5.2 示例演示

要比较 gnulinux 文件并生成统一格式的补丁文件,我们可以使用以下命令:

diff -u gnu linux > gnu-linux.patch

输出补丁文件:

--- gnu 2025-06-06 17:25:23.430342856 +0800
+++ linux       2025-06-06 17:25:23.434342856 +0800
@@ -1,5 +1,6 @@
-Arch Hurd
-Debian GNU/Hurd
-Debian GNU/kFreeBSDDebian GNU/Linux
-Guix System
+Gentoo
+Android
+Alpine Linux
+OpenWRT
+Ubuntu

解读

  • 行首以 - 开头的行(如 Arch HurdDebian GNU/HurdDebian GNU/kFreeBSDGuix System)表示仅存在于 gnu 文件中的内容。
  • 行首以 + 开头的行(如 GentooAndroidAlpine LinuxOpenWRTUbuntu)表示仅存在于 linux 文件中的内容。
  • 无标记的行(如 Debian GNU/Linux)表示两个文件共有的内容。
  • @@ -1,5 +1,6 @@ 表示差异的行范围:gnu 文件从第1行开始有5行,linux 文件从第1行开始有6行。

为了更直观地比较两个文件的内容,可以使用并排(side-by-side)格式:

diff -y gnu linux

输出如下:

Arch Hurd                                                     <
Debian GNU/Hurd                                               <                                                                                      
Debian GNU/kFreeBSD                                           <                                                                                      
Debian GNU/Linux                                                Debian GNU/Linux                                                                     
Guix System                                                   | Gentoo> Android> Alpine Linux                                                                         > OpenWRT                                                                              > Ubuntu 

解读

  • 左侧列显示 gnu 文件的内容,右侧列显示 linux 文件的内容。
  • 共有的行(如 Debian GNU/Linux)对齐显示。
  • 独有的行以 <(仅在 gnu 中)或 >(仅在 linux 中)标记。
  • 空行表示对方文件中没有对应内容。

虽然命令行中的并排输出便于快速查看,但对于大型文件或复杂差异,终端显示可能显得不够直观。此时,可以借助图形化工具进一步增强体验。推荐使用图形化工具如 MeldVimdiff

meld gnu linux

在这里插入图片描述
或者 Vimdiff,它是Vim 编辑器的内置差异模式:

vim -d gnu linux

六、patch:应用差异更新文件

6.1 用法与原理

patch 命令用于将 diff 生成的补丁应用到目标文件,实现内容的更新。基本语法为:

patch [OPTION] < PATCH_FILE

常用选项:

  • -pN:剥离 N 级路径前缀
  • -R:反向应用补丁
  • -i:指定补丁文件

6.2 示例演示

gnu-linux.patch 应用到 gnu 文件:

cp gnu gnu.bak
patch gnu < gnu-linux.patch

检查 gnu 文件内容,应与 linux 文件一致。

反向恢复:

patch -R gnu < gnu-linux.patch

patch 操作,即打补丁操作对于软件的开发是十分有用的,像对软件的源代码进行打补丁其实用的就是patch 这个命令,感兴趣的话可以自行深入学习。


七、工具间的协同工作

7.1 典型组合

这些工具的真正威力在于组合使用。以下是一些典型场景:

  1. 查找独有和共有内容
comm -12 <(sort gnu) <(sort linux) > common.txt
comm -23 <(sort gnu) <(sort linux) > gnu-only.txt
comm -13 <(sort gnu) <(sort linux) > linux-only.txt
  1. 日志分析与去重
cat access.log | sort | uniq -c | sort -nr > error-stats.txt

统计日志中重复错误并按次数倒序排列。

  1. 版本差异管理
diff -u old.conf new.conf > config.patch
patch -p0 < config.patch

生成并应用配置文件补丁。

7.2 复杂实战:分析多文件交集与差异

假设我们需要找出所有文件中独有和共有的系统类型:

cat gnu linux bsd unix | sort | uniq -c > systems.txt

筛选出现多次的系统:

awk '$1 > 1' systems.txt

输出:

      2 Debian GNU/kFreeBSD

进一步比较 bsdunix 的差异:

diff -y bsd unix

输出:

FreeBSD                         | macOS
OpenBSD                         | AIX
GhostBSD                        | Solaris
Debian GNU/kFreeBSD             <

7.3 工具间的依赖关系

  • sort 是基础communiq 依赖已排序的输入。
  • diffpatch 成对使用diff 生成补丁,patch 应用补丁。
  • 管道连接:通过 | 将工具串联,形成数据处理流水线。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84258.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6月6日day46打卡

通道注意力(SE注意力) 知识点回顾&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通道注意力&#xff1a;模型的定义和插入的位置通道注意力…

前端技能包

ES6 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body><script>// 变量定义var a1;let b5; // 现在使用let 定义变量// 对象解构let person{&quo…

大数据(1) 大数据概述

一、大数据时代 1.三次信息化浪潮 二、什么是大数据 1.四个特点 4V&#xff1a;数据量&#xff08;Volume&#xff09;大、数据类型&#xff08;Variety&#xff09;繁多、处理速度&#xff08;Velocity&#xff09;快、价值密度&#xff08;Value&#xff09;低 三、大数据…

element-plus 单选组件 el-radio,选不上,又没报错,直接复制官网也不行解决方案

在使用 Vue 框架开发项目时&#xff0c;Element UI 是常用的组件库。最近在开发中遇到了 Element 单选框组件el-radio的双向绑定问题&#xff0c;直接复制element官网上的的案例下来也是不得&#xff0c;经过调试和探索&#xff0c;终于找到了解决方案&#xff0c;特此记录分享…

使用 Amazon Q Developer CLI 快速搭建各种场景的 Flink 数据同步管道

在 AI 和大数据时代&#xff0c;企业通常需要构建各种数据同步管道。例如&#xff0c;实时数仓实现从数据库到数据仓库或者数据湖的实时复制&#xff0c;为业务部门和决策团队分析提供数据结果和见解&#xff1b;再比如&#xff0c;NoSQL 游戏玩家数据&#xff0c;需要转换为 S…

开疆智能Ethernet/IP转Modbus网关连接质量流量计配置案例

首先设置modbus从站的485参数&#xff0c;确保网关和从站的485参数保持一致。 设置完成后打开网关配置软件并新建项目 先设置网关在Ethernet一侧的IP地址以及数据转换长度。 设置网关的Modbus参数如波特率9600无校验8数据位&#xff08;无校验选8&#xff0c;有校验选9&#xf…

多智能体MPE环境遇到的若干问题

最近学习MADDPG算法&#xff0c;用MPE环境来测试算法性能。于是便下载了pettingzoo包&#xff0c;运行了simple_tag_v3环境&#xff0c;此环境中有猎人、逃亡者和障碍物。 问题1: MPE中的simple_tag_v3环境&#xff0c;在渲染时看似移动的问题 由于相机视角跟随导致的视觉错觉…

[特殊字符] FFmpeg 学习笔记

一、FFmpeg 简介 FFmpeg 是一个开源跨平台的视频和音频处理工具&#xff0c;支持录制、转换、流处理等功能。 官网&#xff1a;https://ffmpeg.org 安装命令&#xff08;macOS&#xff09;&#xff1a; brew install ffmpeg二、基本命令结构 ffmpeg -i 输入文件 [参数] 输出…

leetcode Top100 238. 除自身以外数组的乘积|数组系列

题目链接&#xff1a;238. 除自身以外数组的乘积 - 力扣&#xff08;LeetCode&#xff09; 238. 除自身以外数组的乘积|数组系列 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 …

【Liunx专栏_6】Linux线程概念与控制

目录 1、线程是什么&#xff1f;通过一个图来理解……2、Linux进程和线程&#xff1f;2.1、之间的关系和区别2.2、线程的优缺点&#xff1f; 3、线程的创建3.1、POSIX线程库3.2、创建线程3.3、PS查看运行的线程 4、线程的终止5、线程的等待6、线程分离7、线程封装 1、线程是什么…

「Java基本语法」标识符、关键字与常量

知识点解析 1&#xff0e;标识符&#xff08;Identifiers&#xff09;&#xff1a;用于命名类、方法、变量等。 标识符命名规则&#xff1a; 标识符由字母&#xff08;A-Z&#xff0c;a-z&#xff09;、数字&#xff08;0-9&#xff09;、下划线“_”或美元符号“$”组成。标…

Nginx Stream 层连接数限流实战ngx_stream_limit_conn_module

1.为什么需要连接数限流&#xff1f; 数据库/Redis/MQ 连接耗资源&#xff1a;恶意脚本或误配可能瞬间占满连接池&#xff0c;拖垮后端。防御慢速攻击&#xff1a;层叠式限速&#xff08;连接数&#xff0b;带宽&#xff09;可阻挡「Slow Loris」之类的 TCP 低速洪水。公平接入…

LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现

LLMs之Structured Output&#xff1a;vLLM 结构化输出指南—从约束生成到自动解析与高效实现 导读&#xff1a;随着大语言模型&#xff08;LLM&#xff09;在各类任务中的广泛应用&#xff0c;如何使其输出具备可控性、结构化与可解析性&#xff0c;成为实际部署中的关键问题。…

32 C 语言字符处理函数详解:isalnum、isalpha、iscntrl、isprint、isgraph、ispunct、isspace

1 isalnum() 函数 1.1 函数原型 #include <ctype.h>int isalnum(int c); 1.2 功能说明 isalnum() 函数用于检查传入的整数参数是否为 ASCII 编码的字母或数字字符&#xff08;A - Z、a - z、0 - 9&#xff0c;对应 ASCII 值 65 - 90、97 - 122、48 - 57&#xff09;。…

在网络排错中,经常会用到的操作命令和其作用

在网络排错中&#xff0c;经常会用到的操作命令和其作用 网络排错是确保网络连接正常运行的重要环节&#xff0c;通过使用一系列工具和命令&#xff0c;可以有效诊断和解决网络问题。以下是常用的网络排错命令及其作用&#xff1a; 1.ping ping 是一个用于测试主机之间连通性…

C++中友元(friend)高级应用和使用示例

下面列出几个 高级友元应用场景 与典型设计模式&#xff0c;并配以示例&#xff0c;帮助大家在实际项目中灵活运用 friend 机制。 1. ADL 友元注入&#xff08;“注入式友元”&#xff09; 场景&#xff1a;为某个类型定义非成员操作符&#xff08;如算术、流插入等&#xff0…

TCP相关问题 第一篇

TCP相关问题1 1.TCP主动断开连接方为什么需要等待2MSL 如上图所示:在被动链接方调用close&#xff0c;发送FIN时进入LAST_ACK状态&#xff0c;但未收到主动连接方的ack确认&#xff0c;需要被动连接方重新发送一个FIN&#xff0c;而为什么是2MSL&#xff0c;一般认为丢失ack在…

STM32启动文件学习(startup_stm32f40xx.s)

原代码 ;******************** (C) COPYRIGHT 2016 STMicroelectronics ******************** ;* File Name : startup_stm32f40xx.s ;* Author : MCD Application Team ;* version : V1.8.0 ;* date : 09-November-2016 ;* Desc…

uni-app学习笔记二十三--交互反馈showToast用法

showToast部分文档位于uniapp官网-->API-->界面&#xff1a;uni.showToast(OBJECT) | uni-app官网 uni.showToast(OBJECT) 用于显示消息提示框 OBJECT参数说明 参数类型必填说明平台差异说明titleString是提示的内容&#xff0c;长度与 icon 取值有关。iconString否图…

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

概述 在历经半个月的间歇性开发后&#xff0c;RagflowPlus再次迎来一轮升级&#xff0c;正式发布v0.4.0。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码&#xff1a; git clone https://github.com/zstar1003/ragflow-plus.…