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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84258.shtml
英文地址,請注明出處:http://en.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.…