Linux-awk與sed

文章目錄

  • 一、AWK
    • 1. `awk` 是什么?
    • 2. `awk` 的基礎語法
      • 2.1 選項
      • 2.2 模式
      • 2.3 動作
    • 3. `awk` 的內置變量
    • 4. 典型應用場景及示例
      • 4.1 打印特定列
      • 4.2 條件篩選
      • 4.3 使用正則表達式
      • 4.4 統計行數
      • 4.5 字段操作
      • 4.6 使用內置函數
      • 4.7 多文件處理
      • 4.8 使用自定義變量
    • 5. 高級應用:多行處理
    • 6. 實戰案例:日志分析
      • 6.1 提取 IP 地址
      • 6.2 提取狀態碼
      • 6.3 統計每個 IP 的訪問次數
    • 7.begin和end模式
      • 7.1`BEGIN` 模式
        • 示例 1:初始化變量
        • 示例 2:設置輸入字段分隔符
      • 7.2`END` 模式
        • 示例 1:打印總結信息
        • 示例 2:統計文件行數
      • 7.3 綜合示例
  • 二、SED
    • 1. `sed` 是什么?
    • 2. `sed` 的基礎語法
      • 2.1 選項
      • 2.2 命令
    • 3. 常用命令及示例
      • 3.1 替換(`s`)
        • 示例 1:替換文本中的單詞
        • 示例 2:全局替換(`g` 標志)
        • 示例 3:替換第 2 行的內容
        • 示例 4:替換匹配正則表達式的行
      • 3.2 刪除(`d`)
        • 示例 1:刪除第 5 行
        • 示例 2:刪除第 5 到第 10 行
        • 示例 3:刪除所有包含 `error` 的行
      • 3.3 打印(`p`)
        • 示例 1:打印第 5 行
        • 示例 2:打印第 5 到第 10 行
        • 示例 3:打印所有包含 `error` 的行
      • 3.4 追加(`a`)和插入(`i`)
        • 示例 1:在第 5 行后追加文本
        • 示例 2:在第 5 行前插入文本
      • 3.5 替換整行(`c`)
        • 示例 1:將第 5 行替換為新內容
    • 4. 高級應用
      • 4.1 多命令組合
        • 示例:先替換,再刪除
      • 4.2 直接修改文件(`-i`)
        • 示例:直接替換文件中的內容
      • 4.3 使用擴展正則表達式(`-r` 或 `-E`)
        • 示例:匹配單詞邊界
    • 5. 實戰案例:日志處理
      • 5.1 刪除所有包含 `error` 的行
      • 5.2 替換狀態碼 `200` 為 `OK`
      • 5.3 在每行末尾追加注釋
  • 參考文檔


一、AWK

1. awk 是什么?

awk 是一種強大的文本處理工具,主要用于處理結構化的文本數據(如表格、日志文件等)。它能夠逐行讀取文件內容,根據指定的規則對每一行進行處理,并輸出結果。awk 的名字來源于其發明者的姓氏首字母(Aho、Weinberger、Kernighan)。


2. awk 的基礎語法

awk 的基本語法如下:

awk [選項] '模式 {動作}' 文件

2.1 選項

  • -F fs:指定輸入字段分隔符(默認是空格或制表符)。
  • -v var=value:向 awk 腳本傳遞變量。
  • -f script.awk:從文件讀取 awk 腳本。

2.2 模式

模式用于指定哪些行需要執行動作。可以是:

  • 空模式({}):匹配所有行。
  • 正則表達式(/pattern/):匹配符合正則表達式的行。
  • 條件表達式($1 > 100):匹配滿足條件的行。

2.3 動作

動作是用 {} 包裹的代碼塊,用于對匹配的行進行處理。可以使用 awk 的內置函數和變量。


3. awk 的內置變量

awk 提供了許多內置變量,用于處理文本數據:

變量作用
$0當前行的全部內容
$1, $2, ...當前行的第 1、第 2、… 個字段
NF當前行的字段數
NR當前行號(全局)
FNR當前文件的行號
FS輸入字段分隔符(默認是空格或制表符)
OFS輸出字段分隔符(默認是空格)
RS輸入記錄分隔符(默認是換行符)
ORS輸出記錄分隔符(默認是換行符)

4. 典型應用場景及示例

4.1 打印特定列

需求:打印 /etc/passwd 文件的第 1 列和第 7 列(字段分隔符是冒號 :)。

awk -F: '{print $1, $7}' /etc/passwd

4.2 條件篩選

需求:篩選出第 2 列大于 100 的行。

awk '$2 > 100' data.txt

4.3 使用正則表達式

需求:篩選出包含單詞 error 的行。

awk '/error/' access.log

4.4 統計行數

需求:統計文件的行數。

awk 'END {print NR}' file.txt

4.5 字段操作

需求:將第 1 列和第 2 列拼接成新的字段,用逗號分隔。

awk -F: '{print $1 "," $2}' /etc/passwd

4.6 使用內置函數

需求:計算每行的字段數。

awk '{print NF}' data.txt

4.7 多文件處理

需求:同時處理多個文件,打印每個文件的行號和內容。

awk '{print FNR, $0}' file1.txt file2.txt

4.8 使用自定義變量

需求:計算所有行的第 3 列的總和。

awk '{sum += $3} END {print sum}' data.txt

5. 高級應用:多行處理

需求:打印每行的前 3 行內容。

awk '{print NR-3, NR-2, NR-1, NR, $0}' data.txt

6. 實戰案例:日志分析

假設有一個日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

6.1 提取 IP 地址

awk '{print $1}' access.log

6.2 提取狀態碼

awk '{print $9}' access.log

6.3 統計每個 IP 的訪問次數

awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log

7.begin和end模式

awk 中,BEGINEND 是兩個特殊的模式。

  • BEGIN:在處理任何輸入行之前執行一次,適合初始化變量、設置輸入字段分隔符等。
  • END:在處理完所有輸入行之后執行一次,適合打印總結信息、執行后續操作等。

7.1BEGIN 模式

BEGIN 模式在處理任何輸入行之前執行一次。它通常用于:

  • 初始化變量。
  • 設置輸入字段分隔符(FS)。
  • 執行一些在處理文件之前需要完成的操作。
示例 1:初始化變量

假設我們要計算文件中所有數字的總和,可以在 BEGIN 中初始化總和變量。

awk 'BEGIN {sum = 0}{sum += $1}END {print "總和是: " sum}' data.txt
示例 2:設置輸入字段分隔符

假設文件的字段分隔符是逗號(,),可以在 BEGIN 中設置 FS

awk 'BEGIN {FS=","}{print $1, $2}' data.csv

7.2END 模式

END 模式在處理完所有輸入行之后執行一次。它通常用于:

  • 打印總結信息。
  • 執行一些在處理文件之后需要完成的操作。
示例 1:打印總結信息

假設我們要計算文件中所有數字的總和,并在處理完所有行后打印總和。

awk 'BEGIN {sum = 0}{sum += $1}END {print "總和是: " sum}' data.txt
示例 2:統計文件行數

假設我們要統計文件的行數。

awk 'END {print NR}' file.txt

7.3 綜合示例

假設我們有一個日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

需求:統計每個狀態碼的出現次數,并在處理完所有行后打印總結信息。

awk 'BEGIN {FS=" "}{status_code = $9if (status_code in status_count) {status_count[status_code]++} else {status_count[status_code] = 1}}END {for (code in status_count) {print "狀態碼 " code " 出現了 " status_count[code] " 次"}}' access.log

建議

  • 初始化變量:在 BEGIN 中初始化變量,避免在動作塊中重復初始化。
  • 總結信息:在 END 中打印總結信息,避免在動作塊中重復計算。
  • 調試:在 BEGINEND 中打印調試信息,幫助定位問題。

二、SED

1. sed 是什么?

sed(Stream Editor)是一種流編輯器,主要用于對文本數據進行處理。它逐行讀取輸入(可以是文件或標準輸入),對每一行執行指定的編輯操作,并輸出結果。sed 的操作是基于正則表達式的,非常適合進行文本替換、刪除、插入等操作。


2. sed 的基礎語法

sed 的基本語法如下:

sed [選項] '命令' 文件

2.1 選項

  • -i:直接修改文件內容(慎用,會覆蓋原文件)。
  • -e:允許使用多條命令。
  • -f:從文件讀取命令。
  • -r-E:使用擴展正則表達式(更強大的正則表達式支持)。
  • -n:靜默模式,不自動打印每一行,需要顯式使用 p 命令打印。

2.2 命令

sed 的命令格式為:

[地址]命令
  • 地址:可以是行號(如 5)、范圍(如 5,10)、正則表達式(如 /pattern/)等。
  • 命令:常見的命令有 s(替換)、d(刪除)、p(打印)、a(追加)、i(插入)等。

3. 常用命令及示例

3.1 替換(s

sed 最常用的命令是 s,用于替換文本中的內容。

示例 1:替換文本中的單詞

需求:將文件中的所有 foo 替換為 bar

sed 's/foo/bar/' file.txt
示例 2:全局替換(g 標志)

需求:將文件中的所有 foo 替換為 bar(每行替換所有出現的 foo)。

sed 's/foo/bar/g' file.txt
示例 3:替換第 2 行的內容

需求:只替換第 2 行中的 foobar

sed '2s/foo/bar/' file.txt
示例 4:替換匹配正則表達式的行

需求:只替換包含 error 的行中的 foobar

sed '/error/s/foo/bar/' file.txt

3.2 刪除(d

刪除指定的行。

示例 1:刪除第 5 行
sed '5d' file.txt
示例 2:刪除第 5 到第 10 行
sed '5,10d' file.txt
示例 3:刪除所有包含 error 的行
sed '/error/d' file.txt

3.3 打印(p

打印指定的行(通常與 -n 選項一起使用)。

示例 1:打印第 5 行
sed -n '5p' file.txt
示例 2:打印第 5 到第 10 行
sed -n '5,10p' file.txt
示例 3:打印所有包含 error 的行
sed -n '/error/p' file.txt

3.4 追加(a)和插入(i

在指定位置追加或插入文本。

示例 1:在第 5 行后追加文本
sed '5a ===' file.txt
示例 2:在第 5 行前插入文本
sed '5i ===' file.txt

3.5 替換整行(c

將指定行替換為新內容。

示例 1:將第 5 行替換為新內容
sed '5c new line' file.txt

4. 高級應用

4.1 多命令組合

可以使用 -e 選項組合多個命令。

示例:先替換,再刪除
sed -e 's/foo/bar/' -e '5d' file.txt

4.2 直接修改文件(-i

直接修改文件內容(慎用,會覆蓋原文件)。

示例:直接替換文件中的內容
sed -i 's/foo/bar/' file.txt

4.3 使用擴展正則表達式(-r-E

使用更強大的正則表達式。

示例:匹配單詞邊界
sed -r 's/\bfoo\b/bar/' file.txt

5. 實戰案例:日志處理

假設有一個日志文件 access.log,格式如下:

192.168.1.1 - - [25/Jul/2024:10:42:35 +0800] "GET /index.html HTTP/1.1" 200 1234
192.168.1.2 - - [25/Jul/2024:10:42:36 +0800] "POST /submit HTTP/1.1" 200 5678

5.1 刪除所有包含 error 的行

sed '/error/d' access.log

5.2 替換狀態碼 200OK

sed 's/200/OK/' access.log

5.3 在每行末尾追加注釋

sed 's/$/ # processed/' access.log

參考文檔

  1. 官方文檔:GNU Sed Manual
  2. 在線教程:Sed One-Liners Explained
  3. 官方文檔:GNU Awk User’s Guide
  4. 在線教程:Learn Awk the Hard Way

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

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

相關文章

文件加密工具(勒索病毒加密方式)

語言:C# WPF功能:文件加/解密本程序不提供下載,該程序新手操作不當,可能會導致文件加密后無法解密問題,解密需要獨立私鑰private.key文件支持,沒有私鑰加密文件是無法被解密的。更新:2025年7月3…

IOC實現原理源碼解析

Spring三級緩存流程圖singletonObjects(一級緩存):緩存經過了完整生命周期的Bean;arlySingletonobjects(二級緩存):緩存未經過完整生命周期的Bean,如果某個Bean出現了循環依賴&#…

筆記本電腦磁盤維護指南:WIN11系統磁盤維護完全手冊

1. 引言 在當今數字化時代,筆記本電腦已經成為我們工作、學習和娛樂不可或缺的重要工具。隨著Windows 11操作系統的普及和應用,用戶對于系統性能和穩定性的要求越來越高。然而,許多用戶往往忽視了一個至關重要的方面——磁盤維護。磁盤作為計算機系統中負責數據存儲和讀取的…

李宏毅2025《機器學習》-第九講:大型語言模型評測的困境與“古德哈特定律”**

摘要: 隨著大型語言模型(LLM)的推理能力日益增強,如何公平、準確地評測其“智力”水平,成了一個極其棘手的問題。本文基于李宏毅教授的最新課程,深入探討了當前LLM評測面臨的困境。文章首先揭示了標準數學和…

Spring Boot集成Chaos Monkey:構建高韌性系統的故障注入實戰指南

Spring Boot集成Chaos Monkey:構建高韌性系統的故障注入實戰指南一、Chaos Engineering核心原理1.1 混沌工程價值矩陣1.2 Chaos Monkey核心攻擊類型二、Spring Boot集成Chaos Monkey2.1 基礎集成配置依賴引入配置文件 - application.yml2.2 高級攻擊策略配置自定義攻…

AtCoder Beginner Contest 416(ABCDE)

A - Vacation Validation 翻譯&#xff1a; 給你一個長度為 N 的字符串 S&#xff0c;它由 o 和 x 以及整數 L 和 R 組成。 請判斷 S 中從第 L 個字符到第 R 個字符的所有字符是否都是 o。 思路&#xff1a; &#xff08;模擬&#xff09; 實現&#xff1a; #include<bits…

【AlphaFold3】網絡架構篇(2)|Input Embedding 對輸入進行特征嵌入

博主簡介&#xff1a;努力學習的22級計算機科學與技術本科生一枚&#x1f338;博主主頁&#xff1a; Yaoyao2024往期回顧&#xff1a;【AlphaFold3】網絡架構篇&#xff08;1&#xff09;|概覽預測算法每日一言&#x1f33c;: 去留無意&#xff0c;閑看庭前花開花落&#xff1b…

秋招Day20 - 微服務 - 概念

什么是微服務&#xff1f;將一個大型的單體項目分割成一個個可以獨立開發和部署的小服務&#xff0c;服務之間松耦合&#xff0c;可以通過輕量級通信機制&#xff08;比如HTTP&#xff09;相互協作微服務帶來了哪些挑戰&#xff1f; 介紹一下一下Dubbo&#xff1f;Dubbo是一個高…

PyTorch 生態四件套:從圖片、視頻到文本、語音的“開箱即用”實踐筆記

寫在前面 當我們談論 PyTorch 時&#xff0c;我們首先想到的是 torch.Tensor、nn.Module 和強大的自動求導系統。但 PyTorch 的力量遠不止于此。為了讓開發者能更高效地處理圖像、文本、音頻、視頻等真實世界的復雜數據&#xff0c;PyTorch 建立了一個強大的官方生態系統。本文…

2023 年 NOI 最后一題題解

問題描述2023 年 NOI 最后一題是一道融合圖論與動態規劃的綜合優化問題&#xff0c;聚焦于帶時間窗約束的多路徑規劃。題目具體要求如下&#xff1a;給定一個有向圖&#xff0c;其中節點代表城市&#xff0c;邊代表交通路線。每條邊具有三個屬性&#xff1a;行駛時間、基礎費用…

Android補全計劃 TextView設置文字不同字體和顏色

1 富文本 1 java中動態加載文本 顏色 String strMsg "今天<font color\"#00ff00\">天氣不錯</font>"; tv_msg.setText(Html.fromHtml(strMsg));字體和顏色 String str2 "今天<font color\"#00ff00\"><big>天氣不…

C語言:詳解單鏈表與例題

C語言&#xff1a;詳解單鏈表與例題 1.單鏈表的實現 2.例題&#xff1a;移除鏈表元素 1.單鏈表的實現 鏈表根據帶頭或不帶頭、單向或雙向、循環或不循環分類為8種&#xff0c;最常用的是單鏈表和雙向鏈表&#xff0c;單鏈表是 不帶頭單向不循環 鏈表。 鏈表由節點組成&#xff…

從0開始學習R語言--Day62--RE插補

對于會有多次測量值的數據&#xff0c;用普通的回歸去插補&#xff0c;往往會忽略掉數據個體本身的特點&#xff0c;畢竟多次的測量值其實就代表了數據個體的不穩定性&#xff0c;存在額外的干擾。而RE的插補原理是結合個體本身的隨機效應和群體的固體效應再加上截距進行插補的…

RESTful API開發指南:使用Spring Boot構建企業級接口

目錄 1. 引言2. RESTful API基礎概念3. Spring Boot環境搭建4. 項目結構設計5. 核心組件開發6. 數據庫集成7. 安全認證8. 異常處理9. API文檔生成10. 測試策略11. 部署與監控12. 最佳實踐 1. 引言 在現代軟件開發中&#xff0c;RESTful API已成為構建分布式系統和微服務架構…

從 Print 到 Debug:用 PyCharm 掌控復雜程序的調試之道

目錄摘要調試工具窗口會話工具欄調試工具欄單步工具欄調試器選項卡調用棧幀&#xff08;Frames&#xff09;變量&#xff08;Variables&#xff09;&#x1f4a1; 表達式求值區域&#xff08;Evaluate expression field&#xff09;&#x1f5b1;? 右鍵菜單&#xff08;Contex…

用于前列腺活檢分級的分層視覺 Transformer:邁向彌合泛化差距|文獻速遞-醫學影像算法文獻分享

Title題目Hierarchical Vision Transformers for prostate biopsy grading: Towardsbridging the generalization gap用于前列腺活檢分級的分層視覺 Transformer&#xff1a;邁向彌合泛化差距01文獻速遞介紹前列腺癌是全球男性中第二常見的確診癌癥&#xff0c;也是第五大致命癌…

Apple基礎(Xcode②-Flutter結構解析)

&#x1f3d7;? 目錄結構速查表&#xff08;your_project/ios/ 下&#xff09;ios/ ├── Runner/ ← 原生 iOS 工程根目錄&#xff08;Xcode 打開它&#xff09; │ ├── AppDelegate.swift ← App 入口&#xff08;類似 Android 的 MainActivity&…

X00229-基于深度強化學習的車聯網資源分配python完整

X00229-基于深度強化學習的車聯網資源分配python完整

面向多模態自監督學習的共享表示與獨有表示解耦

通俗說法&#xff1a;在多模態自監督學習中&#xff0c;將共享信息和獨有信息分離開來 Abstract 問題&#xff1a; 傳統方法通常假設在訓練和推理階段都可以訪問所有模態信息&#xff0c;這在實際應用中面對模態不完整輸入時會導致性能顯著下降。 解決方法&#xff1a;提出了一…

【iOS】weak修飾符

前言前面我們已經學習了解了sideTable&#xff0c;今天來看看在OC中&#xff0c;sideTable是如何在我們使用weak時工作的。在OC中&#xff0c;weak修飾符是一種用于聲明“弱引用”的關鍵字&#xff0c;其核心特性是不參與對象的引用計數管理&#xff0c;而且當被引用的對象被釋…