Linux 文本處理三劍客:awk、grep、sed 完全指南

Linux 文本處理三劍客:awk、grep、sed 完全指南

1. 概述

Linux 系統提供了三個強大的文本處理工具:awk、grep 和 sed,它們各有所長,結合使用可以高效地處理文本數據。

  • awk:擅長文本分析和格式化輸出,是一門強大的腳本語言。
  • grep:擅長文本搜索和過濾。
  • sed:擅長文本編輯和轉換。

這三個工具都支持正則表達式,可以處理標準輸入和文件輸入,是 Shell 腳本編程中不可或缺的工具。


2. awk 使用指南

2.1 基本介紹

awk 是一種編程語言,專門用于文本處理和數據提取,支持變量、條件判斷、循環等編程特性。其名稱來源于三位創始人的姓氏首字母。

2.2 基本語法

awk '模式 { 動作 }' [輸入文件...]
命令 | awk '模式 { 動作 }'

2.3 工作原理

awk 按行處理文本,每行被分割成多個字段:

  • $0:整行內容
  • $1:第一個字段
  • $2:第二個字段

2.4 常用選項

選項說明示例
-F指定輸入字段分隔符awk -F: '{print $1}' /etc/passwd
-v定義變量awk -v var=10 '{print $1 + var}' file
-f從腳本文件中讀取 awk 命令awk -f script.awk data.txt

2.5 內置變量

變量說明示例
FS輸入字段分隔符(默認空格)awk 'BEGIN{FS=":"}{print $1}' file
OFS輸出字段分隔符(默認空格)awk 'BEGIN{OFS="-"}{print $1,$2}' file
RS輸入記錄分隔符(默認換行符)awk 'BEGIN{RS=";"}{print}' file
ORS輸出記錄分隔符(默認換行符)awk 'BEGIN{ORS="\n\n"}{print}' file
NF當前行的字段數量awk '{if(NF>5) print $0}' file
NR當前處理的總行號awk '{print NR, $0}' file
FNR當前文件中的行號awk '{print FNR, $0}' file1 file2
FILENAME當前文件名awk '{print FILENAME, $0}' file

2.6 示例

# 打印指定列(源文檔示例)
awk '{print $1, $3}' file.txt# 指定分隔符(源文檔示例)
awk -F: '{print $1, $6}' /etc/passwd# 使用條件過濾(源文檔示例)
awk '$3 > 1000 {print $1}' /etc/passwd# 計算數值總和(源文檔示例)
awk '{sum += $1} END {print sum}' file.txt# 使用BEGIN和END塊(源文檔示例)
awk 'BEGIN {print "開始處理"} {print $0} END {print "處理完成"}' file.txt# 使用內置變量(源文檔示例)
awk '{print "行號:", NR, "字段數:", NF, "內容:", $0}' file.txt# 打印雇員信息(源文檔示例)
awk '{ print }' employee.txt# 輸出特定行(源文檔示例)
awk '/張三/ { print }' employee.txt# 統計滿足特定條件的記錄數(源文檔示例)
awk '/術/ { count=count+1 } END { print "Count="count }' employee.txt# 格式化輸出表格(源文檔綜合示例)
awk 'BEGIN { printf "序號\t名字\t部門\t年齡\n-------------------\n" } { print } END {printf "-------------------\n"}' employee.txt

2.7 高級用法

# 使用數組統計詞頻(源文檔示例)
awk '{for(i=1;i<=NF;i++) count[$i]++} END {for(word in count) print word, count[word]}' file.txt | sort -k2 -nr# 條件判斷(源文檔示例)
awk '{if($3 > 1000) print "用戶:", $1, "UID:", $3; else print "系統用戶:", $1}' /etc/passwd# 循環處理(源文檔示例)
awk '{for(i=NF;i>=1;i--) printf "%s ", $i; printf "\n"}' file.txt# 9x9乘法表(源文檔示例)
awk 'BEGIN {for(i=1;i<=9;i++){for(j=1;j<=i;j++) printf "%d*%d=%-2d ",j,i,j*i; print}}'

3. grep 使用指南

3.1 基本介紹

grep (Global Regular Expression Print) 用于在文本中搜索匹配指定模式的行。

3.2 基本語法

grep [選項] 模式 [文件...]
命令 | grep [選項] 模式

3.3 常用選項

選項說明示例
-i忽略大小寫grep -i 'hello' file.txt
-v反向匹配,顯示不匹配的行grep -v '^#' config.conf
-n顯示行號grep -n 'error' logfile.txt
-c只顯示匹配的行數grep -c 'pattern' data.txt
-r遞歸搜索目錄grep -r 'function' /path/to/code/
-l只顯示包含匹配的文件名grep -l 'TODO' *.py
-E使用擴展正則表達式`grep -E '(error
-A n顯示匹配行及其后n行grep -A 3 'Exception' traceback.log
-B n顯示匹配行及其前n行grep -B 2 'segmentation fault' system.log
-C n顯示匹配行及其前后各n行grep -C 2 'keyword' file.txt

3.4 示例

# 搜索包含"error"的行(源文檔示例)
grep 'error' logfile.txt# 忽略大小寫搜索(源文檔示例)
grep -i 'error' logfile.txt# 顯示行號(源文檔示例)
grep -n 'error' logfile.txt# 搜索并顯示后3行內容(源文檔示例)
grep -A 3 'error' logfile.txt# 遞歸搜索目錄(源文檔示例)
grep -r 'function' /path/to/code/# 使用擴展正則表達式(源文檔示例)
grep -E '(error|warning)' logfile.txt# 統計文件中包含特定模式的記錄數(源文檔awk示例的grep等效)
grep -c 'pattern' employee.txt# 輸出總長度大于10的行(源文檔awk示例的grep等效)
grep '.\{11,\}' employee.txt

4. sed 使用指南

4.1 基本介紹

sed (Stream EDitor) 是一個流編輯器,用于對文本進行非交互式的編輯。

4.2 基本語法

sed [選項] '命令' [輸入文件...]
命令 | sed [選項] '命令'

4.3 常用選項

選項說明示例
-n抑制自動輸出,只顯示處理過的行sed -n '10p' file.txt
-e允許多個編輯命令sed -e 's/foo/bar/' -e '/baz/d' file
-i直接修改文件內容sed -i.bak 's/old/new/g' file.txt
-r使用擴展正則表達式`sed -r 's/(foobar)/YES/g’ file`

4.4 常用命令

命令說明示例
s/模式/替換/標志替換操作sed 's/old/new/g' file.txt
p打印sed -n '1,5p' file.txt
d刪除sed '/pattern/d' file.txt
a\文本在行后追加文本sed '$a\追加到最后一行' file.txt
i\文本在行前插入文本sed '1i\插入到第一行' file.txt
c\文本替換整行sed '/pattern/c\新的整行內容' file.txt

4.5 示例

# 替換文本(源文檔示例)
sed 's/old/new/g' file.txt# 刪除空行(源文檔示例)
sed '/^$/d' file.txt# 直接修改文件(源文檔示例)
sed -i 's/old/new/g' file.txt# 打印特定行(源文檔示例)
sed -n '10,20p' file.txt# 多重編輯(源文檔示例)
sed -e 's/foo/bar/g' -e '/baz/d' file.txt# 在匹配行后追加內容(源文檔示例)
sed '/pattern/a\追加的內容' file.txt# 模擬cat命令打印文件內容(源文檔示例)
sed '' data.txt# 從標準輸入中讀取數據(源文檔示例)
echo "hello world" | sed ''# 使用腳本文件(源文檔示例)
echo -e "1d\n2d\n5d" > scripts
sed -f scripts data.txt

5. 綜合應用示例

5.1 日志分析

# 分析日志中的錯誤,統計每種錯誤的數量(源文檔grep示例擴展)
grep 'ERROR' application.log | awk '{print $5}' | sort | uniq -c | sort -nr# 提取最近一小時的日志并分析(源文檔sed示例擴展)
sed -n "/$(date -d '1 hour ago' '+%H:%M:%S')/,\$p" application.log | grep 'ERROR' | awk '{print $5}' | sort | uniq -c

5.2 數據提取和轉換

# 從CSV文件中提取特定列并轉換格式(源文檔awk示例擴展)
awk -F, '{print $1 "," $3 "," $5}' data.csv | sed 's/舊值/新值/g' > processed_data.csv# 提取網頁中的鏈接(源文檔grep示例擴展)
curl -s http://example.com | grep -o 'href="[^"]*"' | sed 's/href="//;s/"$//' | awk '!/^#/ && !/^javascript:/'# 生成格式化的文本報告(源文檔awk綜合示例擴展)
awk 'BEGIN {printf "序號\t名字\t部門\t年齡\n-------------------\n"} {printf "%s\t%s\t%s\t%s\n", $1, $2, $3, $4} END {printf "-------------------\n"}' employee.txt

5.3 系統監控

# 監控進程內存使用(源文檔awk示例擴展)
ps aux | awk '{if($4 > 5.0) print "進程:", $11, "內存使用:", $4"%"}'# 分析磁盤使用情況(源文檔awk示例擴展)
df -h | awk '/\/dev\/sd/ {print "分區:", $1, "使用率:", $5, "可用空間:", $4}'# 檢查系統用戶(源文檔awk示例擴展)
awk -F: '$3 < 1000 {print "系統用戶:", $1} $3 >= 1000 {print "普通用戶:", $1}' /etc/passwd

6. 正則表達式參考

6.1 基本元字符

元字符說明
.匹配任意單個字符
*匹配前一個字符0次或多次
+匹配前一個字符1次或多次
?匹配前一個字符0次或1次
^匹配行首
$匹配行尾
[]匹配括號內的任意字符
[^]不匹配括號內的任意字符
``
()分組

6.2 字符類

字符類說明
[[:alpha:]]字母字符
[[:digit:]]數字字符
[[:alnum:]]字母數字字符
[[:space:]]空白字符
[[:lower:]]小寫字母
[[:upper:]]大寫字母

6.3 轉義字符

轉義序列說明
\n換行符
\t制表符
\s空白字符
\S非空白字符
\w單詞字符
\W非單詞字符
\d數字字符
\D非數字字符

7. 總結與速查

7.1 工具選擇指南

  • 搜索文本:使用 grep
  • 編輯文本:使用 sed
  • 處理結構化數據:使用 awk
  • 復雜文本處理:結合使用三者

7.2 常用命令速查

awk 常用命令

awk '{print $1}' file                 # 打印第一列
awk -F: '{print $1}' file             # 指定冒號分隔符并打印第一列
awk 'NR==10' file                     # 打印第10行
awk '$1 > 100' file                   # 過濾第一列大于100的行
awk '{sum+=$1} END{print sum}' file   # 對第一列求和
awk 'BEGIN{FS=":";OFS="-"}{print $1,$3}' file # 設置輸入輸出分隔符并打印
awk '/pattern/{count++} END{print count}' file # 統計模式出現次數

grep 常用命令

grep pattern file                     # 基本搜索
grep -i pattern file                  # 忽略大小寫
grep -v pattern file                  # 反向匹配
grep -n pattern file                  # 顯示行號
grep -r pattern dir                   # 遞歸搜索
grep -E "pattern1|pattern2" file      # 擴展正則表達式(或)
grep -c pattern file                  # 統計匹配行數
grep -A n pattern file                # 顯示匹配行及后n行

sed 常用命令

sed 's/old/new/g' file                # 全局替換
sed '/pattern/d' file                 # 刪除匹配行
sed -n '10,20p' file                  # 打印10-20行
sed -i.bak 's/old/new/' file          # 直接修改文件并備份原文件
sed '/^#/d; /^$/d' file               # 刪除注釋和空行
sed '1,5s/old/new/g' file             # 替換1-5行的內容
sed '/pattern/a\text' file            # 在匹配行后追加文本

7.3 性能優化技巧

  • 盡量使用最簡單的正則表達式
  • 在 grep 中使用 -F 選項處理固定字符串
  • 在 awk 中預先處理數據減少后續操作
  • 使用管道連接多個簡單操作而不是一個復雜操作
  • 對于大文件,考慮使用 split 分割后并行處理

7.4 常見問題解決

  • 特殊字符處理:使用轉義字符或不同的定界符(如 s#old#new#
  • 跨行匹配:使用 sed 的 ND 命令或 awk 的 RS 變量
  • 性能問題:優化正則表達式,減少回溯
  • 編碼問題:確保終端和文件編碼一致

通過掌握這三款工具的組合使用,可以解決 Linux 環境下絕大多數文本處理需求,大大提高工作效率。本文檔涵蓋了源文檔中的主要示例和用法,并添加了選項示例,可以作為日常參考和學習的指南。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/93963.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/93963.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/93963.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

pyecharts可視化圖表組合組件_Grid:打造專業數據儀表盤

pyecharts可視化圖表組合組件_Grid&#xff1a;打造專業數據儀表盤 目錄pyecharts可視化圖表組合組件_Grid&#xff1a;打造專業數據儀表盤引言圖表1&#xff1a;Grid-Overlap-多X/Y軸示例代碼解析1. 圖表創建2. 多軸配置3. 圖表重疊4. Grid布局效果與應用圖表2&#xff1a;Gri…

【電氣工程學習】

三極管中&#xff1a;集電極C,基極B&#xff0c;發射極E接線&#xff1a;棕正藍負黑信號NPN開關輸出的是我們的0V,也叫低電平PNP開關輸出的是24V,也就是高電平&#xff08;NPN開關導通時&#xff0c;相當于把輸出端“拉”到0V&#xff08;低電平&#xff09;&#xff0c;稱為“…

【嵌入式】CAN通信

CAN 總線最初由博世于1980年代為汽車行業開發&#xff0c;能夠簡化復雜的布線網絡&#xff0c;還確保可靠和安全的數據傳輸。 1.CAN技術解釋 CAN網絡中的每個節點&#xff0c;都是平等的&#xff0c;沒有主次之分&#xff0c;這一點和SPI和I2C不同。每個節點都可以在需要的時…

Apache ShenYu網關與Nacos的關聯及如何配合使用

Apache ShenYu 網關與 Nacos 之間的關系可以概括為 “協作互補”:Nacos 作為 服務注冊與配置中心,為 ShenYu 提供動態的服務發現和配置管理能力,而 ShenYu 作為 流量網關,依賴 Nacos 實現路由信息的動態更新和實時生效。以下是詳細解析: 1. 核心關系圖解 拉取服務列表/路…

【CPP】一個CPP的Library(libXXXcore)和測試程序XXX_main的Demo

一個CPP的Library和測試程序Demo 1. 思路描述 目錄結構 總控CMakeList.txt文件 2. Library代碼實現 2.1 XXXLib.hpp文件(對外的接口定義文件)和XXXLib.cpp文件 2.1.1 XXXLib.hpp文件 2.1.2 XXXLib.cpp文件 2.2 CXXXLibApi.hpp文件和CXXXLibApi.cpp文件(內部的API基類) 2.2.1 CX…

【YashanDB認證】學習YashanDB的探索之路:從入門到實踐

在國產數據庫蓬勃發展的浪潮中&#xff0c;選擇了YashanDB作為技術學習的切入點。這不僅讓我深入了解了數據庫的核心技術&#xff0c;也讓我深刻體會到國產數據庫在性能、可靠性和生態適配上的創新價值。以下是我在學習YashanDB過程中的經驗與感悟。 一、YashanDB基礎介紹 Ya…

element UI 和 element plus 在組件上有哪些不同

Element UI 和 Element Plus 都是基于 Vue 的桌面端 UI 組件庫&#xff0c;由同一團隊&#xff08;餓了么前端團隊&#xff09;開發和維護。Element Plus 是 Element UI 的升級版&#xff0c;專為 Vue 3 設計&#xff0c;而 Element UI 僅支持 Vue 2。以下是它們在組件層面的主…

【3D重建技術】如何基于遙感圖像和DEM等數據進行城市級高精度三維重建?

城市級高精度三維重建是融合多源空間數據&#xff08;遙感圖像、DEM、GIS矢量等&#xff09;、計算機視覺與地理信息處理技術的復雜過程&#xff0c;核心目標是構建包含“地形地物&#xff08;建筑、道路、植被等&#xff09;”的真實、高精度三維場景。其流程可分為數據準備、…

【unitrix數間混合計算】3.4 無符號小數部分標記trait(bin_unsigned.rs)

一、源碼 這段代碼定義了一個類型級二進制小數系統&#xff0c;用于在編譯時表示和驗證二進制小數部分的有效性。 use crate::number::{F0, BFrac, Bit};/// 標記合法的二進制小數部分類型 pub trait BinFrac: Copy Default static {}// 空小數部分&#xff08;表示值為0&…

從一次 DDoS 的“死亡回放”看現代攻擊鏈的進化

本文記錄的是作者上周在測試環境真實踩到的坑。為了讓讀者能復現并親手體驗防御思路&#xff0c;文末給出了一份最小可運行的 Go 腳本&#xff0c;支持本地壓測 日志回放&#xff0c;方便對比加防護前后的差異。攻擊現場還原 周一凌晨 2:14&#xff0c;監控群里突然彈出告警&a…

LeetCode熱題100--101. 對稱二叉樹--簡單

1. 題目 給你一個二叉樹的根節點 root &#xff0c; 檢查它是否軸對稱。 示例 1&#xff1a;輸入&#xff1a;root [1,2,2,3,4,4,3] 輸出&#xff1a;true 示例 2&#xff1a;輸入&#xff1a;root [1,2,2,null,3,null,3] 輸出&#xff1a;false 2. 題解 /*** Definition for…

Pub/Sub是什么意思

Pub/Sub&#xff08;發布/訂閱模式&#xff09;?? 是一種異步消息通信范式&#xff0c;用于分布式系統中不同組件之間的解耦通信。它的核心思想是將消息的發送方&#xff08;發布者&#xff09;?? 和接收方&#xff08;訂閱者&#xff09;?? 分離&#xff0c;通過一個中間…

Redisson3.14.1及之后連接阿里云redis代理模式,使用分布式鎖:ERR unknown command ‘WAIT‘

文章目錄一、問題背景1、問題原因2、阿里云對Redisson的支持二、解決方案1、繼續使用Redisson3.14.0版本2、阿里云redis改為直連模式3、升級Redisson版本到 3.47.0一、問題背景 1、問題原因 阿里云Redis分直連和代理模式&#xff0c;其中代理模式是不支持WAIT命令的。 目前嘗…

Linux: RAID(磁盤冗余陣列)配置全指南

Linux&#xff1a;RAID&#xff08;磁盤冗余陣列&#xff09;配置一、RAID 核心概念 RAID&#xff08;Redundant Array of Independent Disks&#xff0c;磁盤冗余陣列&#xff09;通過將多個物理磁盤組合為一個邏輯存儲設備&#xff0c;實現提升讀寫性能、增強數據安全性或平衡…

《GPT-OSS 模型全解析:OpenAI 回歸開源的 Mixture-of-Experts 之路》

目錄 一、引言 二、GPT-OSS 模型簡介 1. 版本與定位 2. 架構設計與技術亮點 2.1 Mixture-of-Experts&#xff08;MoE&#xff09;架構 2.2 高效推理機制與優化技術 2.3 模型對比 三、模型部署 1. 安裝相關依賴 1.1 uv 安裝 1.2 conda 安裝 1.3 Transformers 運行 g…

【力扣熱題100】雙指針—— 接雨水

題目 給定 n 個非負整數表示每個寬度為 1 的柱子的高度圖&#xff0c;計算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 注意&#xff1a;答案中不可以包含重復的三元組。輸入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 輸出&#xff1a;6 解釋&#xff1a;上面是由…

51單片機拼接板(開發板積木)

一、前言 1.1 背景 讀書那會兒&#xff08;2013年左右&#xff09;網上接了很多51單片機的設計。 當時有個痛點: 每張板子都是定制的&#xff0c;畫板子&#xff0c;打樣&#xff0c;寫代碼需要花費很多時間。 希望有一張板子&#xff0c;能夠實現絕大多數單片機的功能&#xf…

使用segment-anything將目標檢測label轉換為語義分割label

使用segment-anything將目標檢測label轉換為語義分割label一、segment-anything簡介二、segment-anything安裝2.1安裝方法2.2預訓練模型下載三、將目標檢測label轉換為語義分割label3.1示例代碼3.2代碼說明一、segment-anything簡介 segment-anything是facebookresearch團隊開…

【unitrix數間混合計算】3.3 無符號整數標記trait(bin_unsigned.rs)

一、源碼 這段代碼是用 Rust 語言實現的一個類型級無符號二進制整數系統&#xff0c;通過類型系統在編譯時表示和操作二進制數字。這是一種典型的"類型級編程"&#xff08;type-level programming&#xff09;技術。 use crate::number::{U0, Bin, Bit, BinInt};/// …

Python基本語法總結

1.類&#xff08;Class&#xff09;在Python中類&#xff08;Class&#xff09;是面向對象編程&#xff08;OOP&#xff09;的核心概念。1.1.類的基本定義最簡單的類class Cat:"""這是一個最簡單的類"""pass #創建實例 obj Cat()包含方法的類cl…