shell-awk語法整理

shell-awk語法整理

  • 前言
  • 基本語法
  • 內置變量
    • 1. $0
    • 2. NF
    • 3. NR
    • 4. FS
    • 5. RS
    • 6. OFS
    • 7. ORS
    • 8. FILENAME
    • 9. FNR
    • 10. ARGV
    • 11. ENVIRON
    • 12. IGNORECASE
    • 13. RSTART 和 RLENGTH
    • 示例解釋
  • 內置函數
  • 循環語句(后面的';'可不加)
  • 條件語句
  • 高級特性
    • 示例
  • 特殊模式
    • BEGIN
    • END
    • 組合示例
    • BEGINFILE 和 ENDFILE
    • getline 模式
    • 總結
  • 常用命令行選項

前言

AWK是一種功能強大的文本處理工具,可根據指定的規則對文本和數據文件進行逐行處理,通過靈活使用模式和動作的組合,可以實現復雜的文本分析和數據處理任務,適合處理各種格式的文本文件和數據流

基本語法

AWK的基本語法結構為:

awk pattern '{ action }' filename
  • pattern:用來匹配輸入數據的模式
  • action:在匹配到符合模式的行時執行的操作
  • filename:要操作的目標文件

例如,要打印每行以字母 “a” 開頭的文本:

awk '/^a/ { print }' filename

其中,/^a/ 是模式,{ print } 是操作,會打印文件中所有以字母 “a” 開頭的行

內置變量

AWK 提供了許多內置變量,用于獲取關于輸入數據、當前行、行號等信息

1. $0

  • 描述:代表當前行的內容
  • 示例:打印所有行的內容(print后面什么都不帶,也是一樣的效果)
awk '{ print $0 }' filename

2. NF

  • 描述:代表當前行的字段數
  • 示例:打印每行的字段數
awk '{ print NF }' filename

3. NR

  • 描述:代表當前行的行號
  • 示例:打印每行的行號和內容
awk '{ print NR, $0 }' filename

4. FS

  • 描述:代表字段分隔符,默認是空白字符
  • 示例:使用不同的字段分隔符打印字段內容
awk -F':' '{ print $1, $2 }' filename

5. RS

  • 描述:代表記錄分隔符,默認是換行符
  • 示例:按不同的記錄分隔符處理數據
awk 'BEGIN { RS="@" } { print $0 }' filename

6. OFS

  • 描述:代表輸出字段分隔符
  • 示例:設置不同的輸出字段分隔符
awk 'BEGIN { OFS=" | " } { print $1, $2 }' filename

7. ORS

  • 描述:代表輸出記錄分隔符
  • 示例:設置不同的輸出記錄分隔符
awk 'BEGIN { ORS="\n\n" } { print $0 }' filename

8. FILENAME

  • 描述:代表當前輸入文件的名稱
  • 示例:打印當前處理的文件名
awk '{ print FILENAME }' filename

9. FNR

  • 描述:代表當前處理的文件中的行號,從1開始計數
  • 示例:打印當前處理的行號和內容
awk '{ print FNR, $0 }' filename

10. ARGV

  • 描述:一個包含命令行參數的數組
  • 示例:遍歷打印命令行參數
awk 'BEGIN { for (i = 0; i < ARGC; i++) print ARGV[i] }' file1 file2

11. ENVIRON

  • 描述:一個包含環境變量的關聯數組
  • 示例:打印所有環境變量及其值
awk 'BEGIN { for (var in ENVIRON) print var, ENVIRON[var] }'

12. IGNORECASE

  • 描述:控制字符串匹配時是否忽略大小寫
  • 示例:在匹配時忽略大小寫
awk 'BEGIN { IGNORECASE=1 } /pattern/ { print }' filename

13. RSTART 和 RLENGTH

  • 描述:
    • RSTART:上次 match() 函數匹配的起始位置
    • RLENGTH:上次 match() 函數匹配的長度
  • 示例:使用 match() 函數找到并打印匹配的子字符串及其位置
awk '{ if (match($0, /pattern/)) print "Found:", substr($0, RSTART, RLENGTH) }' filename

示例解釋

- $0:表示當前行的全部內容
- NF:表示當前行的字段數
- NR:表示當前行的行號
- FS:用于指定字段分隔符
- RS:用于指定記錄分隔符
- OFS:用于指定輸出字段分隔符
- ORS:用于指定輸出記錄分隔符
- FILENAME:用于輸入文件的名稱
- FNR:用于輸入當前處理的文件中的行號
- ARGV:輸出命令行參數的數組
- ENVIRON:輸出環境變量的關聯數組
- IGNORECASE:控制字符串匹配時是否忽略大小寫
- RSTART:上次 match() 函數匹配的起始位置
- RLENGTH:上次 match() 函數匹配的長度

內置函數

AWK 提供了多種內置函數,用于字符串處理、數學計算等

  • 字符串函數:
    • length(str):返回字符串長度
    • index(str, search):返回搜索字符串在原字符串中的位置
    • split(str, arr, sep):將字符串按分隔符分割成數組
  • 數學函數:
    • sin(x)、cos(x)、sqrt(x):三角函數和平方根函數
    • rand():返回一個0到1之間的隨機數

循環語句(后面的’;'可不加)

AWK支持類C語言風格的循環語句:

  • for循環:
for (i = 1; i <= 10; i++) {print i;
}
  • while循環:
while (condition) {print $0;getline;
}

條件語句

AWK 中的條件語句與其他編程語言類似:

  • if語句:
if (condition) {print "Condition is true";
} else {print "Condition is false";
}
  • switch語句:
switch (variable) {case value1: {print "Value 1";break;}case value2: {print "Value 2";break;}default: {print "Default case";break;}
}

高級特性

AWK還支持更高級的特性,如函數定義、數組操作和模式動作的組合使用:

  • 函數定義:
function add(x, y) {return x + y;
}
  • 數組操作:
# 創建數組
arr["key1"] = "value1";
arr["key2"] = "value2";# 遍歷數組
for (key in arr) {print key, arr[key];
}

示例

演示了AWK的基本語法、內置變量、函數、循環和條件語句的使用:

# AWK script to print lines containing "error"
# and count lines where first field is numeric# Print lines containing "error"
/error/ {print;
}# Count lines where first field is numeric
$1 ~ /^[0-9]+$/ {count++;
}# END block to print count
END {print "Numeric lines count:", count;
}

特殊模式

BEGIN

  • 描述:BEGIN 塊用于在處理任何輸入數據之前執行初始化任務,例如設置變量、打印標題、配置輸出格式等BEGIN 塊中的代碼在任何輸入數據處理之前運行一次

  • 示例:打印表頭,并設置字段分隔符

awk 'BEGIN { OFS = "\t"; print "Name", "Age", "City" } { print $1, $2, $3 }' filename

示例中在處理 filename 文件之前,會打印表頭 “Name”, “Age”, “City”,并將輸出字段分隔符 (OFS) 設置為制表符

END

  • 描述:END 塊用于在處理所有輸入數據之后執行任務,例如打印總結信息、計算總和或平均值等。END 塊中的代碼在所有輸入數據處理完后運行一次

  • 示例:計算并打印行數

awk 'END { print "Total lines:", NR }' filename

示例中在處理完 filename 文件的所有行之后,打印總行數,其中 NR 是記錄數的內置變量,表示總行數

組合示例

可同時使用 BEGIN 和 END 塊來初始化和總結數據處理:

awk 'BEGIN { print "Processing file:", FILENAME } { sum += $2 } END { print "Total sum of second column:", sum }' filename
  • BEGIN { print “Processing file:”, FILENAME }:在處理任何數據之前打印當前處理的文件名
  • { sum += $2 }:處理每一行,將第二列的值累加到 sum 變量中
  • END { print “Total sum of second column:”, sum }:在處理完所有數據后,打印第二列值的總和

BEGINFILE 和 ENDFILE

  • 描述:

    • BEGINFILE:在處理每個輸入文件之前執行一次
    • ENDFILE:在處理每個輸入文件之后執行一次
  • 示例:

awk 'BEGINFILE { print "Start processing", FILENAME }{ print $0 }ENDFILE { print "End processing", FILENAME }' file1 file2

示例會在處理每個輸入文件 file1 和 file2 前后分別打印處理開始和處理結束的消息

getline 模式

  • 描述:

    • getline 模式用于手動從輸入中讀取下一行并處理。可與條件和循環結構一起使用,以控制輸入數據的處理方式
  • 示例:

awk '/pattern/ { print "Found:", $0 if (getline next_line > 0) { print "Next line:", next_line } }' filename

示例會在匹配到某個模式后,打印當前行和下一行的內容(如果存在)

總結

  • BEGIN:特殊模式塊,用于在處理輸入數據之前執行初始化操作
  • END:特殊模式塊,用于在處理完所有輸入數據后執行總結或清理操作
  • BEGINFILE 和 ENDFILE:用于在處理每個輸入文件前后執行特定操作
  • getline模式:允許在腳本執行過程中手動控制輸入行的讀取和處理方式

常用命令行選項

  1. -F separator
  • 描述:指定字段分隔符。默認情況下,字段分隔符為任何空白字符序列
  • 示例:
awk -F ',' '{ print $1 }' filename
-F ',' 指定逗號為字段分隔符,然后打印每行的第一個字段
  1. -v var=value
  • 描述:設置 AWK 變量的值。可以在 AWK 腳本中使用 -v 選項來傳遞變量
  • 示例:
awk -v threshold=50 '$1 > threshold { print $0 }' filename
示例中,定義了一個變量 threshold 并將其傳遞給 AWK 腳本,然后根據條件打印符合要求的行
  1. -f script-file
  • 描述:從指定的文件中讀取 AWK 腳本
  • 示例:
awk -f myscript.awk data.txt
示例中,AWK 將執行 myscript.awk 文件中的腳本來處理 data.txt 文件

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

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

相關文章

R語言實戰—圓形樹狀圖

話不多說&#xff0c;先看最終效果&#xff1a; 圓形樹狀圖是樹狀圖的一個變型&#xff0c;其實都是層次聚類。 接下來看代碼步驟&#xff1a; 首先要先安裝兩個包&#xff1a; install.packages("ggtree") install.packages("readxl") 咱就別問問什么…

29、php實現和為S的兩個數字(含源碼)

題目&#xff1a;php 實現 和為S的兩個數字 描述&#xff1a; 輸入一個遞增排序的數組和一個數字S&#xff0c;在數組中查找兩個數&#xff0c; 是的他們的和正好是S&#xff0c;如果有多對數字的和等于S&#xff0c;輸出兩個數的乘積最小的。 輸出描述&#xff1a; 對應每個測…

go zero入門

一、goctl安裝 goctl 是 go-zero 的內置腳手架&#xff0c;可以一鍵生成代碼、文檔、部署 k8s yaml、dockerfile 等。 # Go 1.16 及以后版本 go install github.com/zeromicro/go-zero/tools/goctllatest檢查是否安裝成功 $ goctl -v goctl version 1.6.6 darwin/amd64vscod…

vue2響應式原理+模擬實現v-model

效果 簡述原理 配置對象傳入vue實例 模板解析&#xff0c;遍歷出所有文本節點&#xff0c;利用正則替換插值表達式為真實數據 data數據代理給vue實例&#xff0c;以后通過this.xxx訪問 給每個dom節點增加觀察者實例&#xff0c;由觀察者群組管理&#xff0c;內部每一個鍵值…

sqlite 數據庫 介紹

文章目錄 前言一、什么是 SQLite &#xff1f;二、語法三、SQLite 場景四、磁盤文件 前言 下載 目前已經出到了&#xff0c; Version 3.46.0 SQLite&#xff0c;是一款輕型的數據庫&#xff0c;是遵守ACID的關系型數據庫管理系統&#xff0c;它包含在一個相對小的C庫中。它是…

VMware虛擬機配置橋接網絡

轉載&#xff1a;虛擬機橋接網絡配置 一、VMware三種網絡連接方式 VMware提供了三種網絡連接方式&#xff0c;VMnet0, VMnet1, Vmnet8&#xff0c;分別代表橋接&#xff0c;Host-only及NAT模式。在VMware的編輯-虛擬網絡編輯器可看到對應三種連接方式的設置&#xff08;如下圖…

美好生活的 100 條建議

簡介 一些簡潔明了的人生建議&#xff0c;易于理解&#xff0c;并且能夠為日常生活中的各個方面提供實用的指導。 財富 (Possessions) 1. If you want to find out about people’s opinions on a product, google \reddit. You’ll get real people arguing, as compared t…

SpringBoot2.2.6使用spring-boot-validation讀取不到自定義配置文件中的屬性

SpringBoot2.2.6沒有做message.properties文件中屬性的自動讀取配置。解決方法有兩種&#xff1a; 1. 升級springboot版本到2.6.x以上 2. 在現有springboot版本的基礎上添加以下自定義配置&#xff1a; Configuration public class RequestParamValidationConfig implements…

學習筆記——交通安全分析12

目錄 前言 當天學習筆記整理 4信控交叉口交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后&#xff0c;本人又開始了新教材《交通安全分析》的學習 #整理過程不易&#xff0c;喜歡UP就點個免費的關注趴 #本期內容接上一期11筆記 當天學習筆記整理 4信控交叉口交…

ORA-03115 ORA-06594--空間不足 rman 磁帶壓縮備份 控制文件恢復后備份信息丟失

---用舊的控制文件恢復后 這個控制文件本身的備份信息不在此還原出的控制文件中。所以這個備份的控制文件就刪不掉&#xff0c;看不到。 但是只要設置正確的dbid&#xff0c;還是可以用恢復這個控制文件的 正常未恢復過controlfile的話&#xff0c;這個控制文件備份信息在現有…

Square Root SAM論文原理

文章目錄 Square Root SAM論文原理核心原理SLAM問題的3種表示貝葉斯網絡因子圖&#xff08;Factor graph&#xff09;馬爾科夫隨機場(Markov Random Field, MRF) SLAM最小二乘問題&線性化因式分解 factorization矩陣與圖(Matrices ? Graphs)因式分解&變量消元(Factori…

Kafka系列之Kafka知識超強總結

一、Kafka簡介 Kafka是什么 Kafka是一種高吞吐量的分布式發布訂閱消息系統&#xff08;消息引擎系統&#xff09;&#xff0c;它可以處理消費者在網站中的所有動作流數據。 這種動作&#xff08;網頁瀏覽&#xff0c; 搜索和其他用戶的行動&#xff09;是在現代網絡上的許多社…

14-22 劍和遠方2 - 深度神經網絡中的學習機制

概論 在第一部分中&#xff0c;我們深入探討了人工智能的興衰簡史以及推動人工智能發展的努力。我們研究了一個簡單的感知器&#xff0c;以了解其組件以及簡單的 ANN 如何處理數據和權重層。在簡單的 ANN 中&#xff0c;不會對數據執行特定操作。ANN 中的激活函數是一個線性函…

Surface splatting (2D Gaussian splatting)代碼分析

源碼地址 colab.research.google.com/drive/1qoclD7HJ3-o0O1R8cvV3PxLhoDCMsH8W 核心代碼 surface_splatting def surface_splatting(means3D, scales, quats, colors, opacities, intrins, viewmat, projmat):# Rasterization setupprojmat torch.zeros(4,4).cuda()projm…

flask使用定時任務flask_apscheduler(APScheduler)

Flask-APScheduler描述: Flask-APScheduler 是一個 Flask 擴展&#xff0c;增加了對 APScheduler 的支持。 APScheduler 有三個內置的調度系統可供您使用&#xff1a; Cron 式調度&#xff08;可選開始/結束時間&#xff09; 基于間隔的執行&#xff08;以偶數間隔運行作業…

c#中的超時終止

在C#中&#xff0c;可以使用CancellationToken和Task的超時機制來實現調用方法時的超時終止。 一 用Task.Delay(int)模擬耗時操作 static async Task Main(string[] args){using (var cts new CancellationTokenSource(1 * 1000)){await doSomething(cts.Token);}Console.Wr…

移動校園(7)ii:uniapp響應攔截器處理token,以及微信小程序報錯當前頁面正在處于跳轉狀態,請稍后再進行跳轉....

依據昨天的寫完&#xff0c;在token過期之后&#xff0c;再次調用接口&#xff0c;會觸發后端攔截&#xff0c;扔進全局錯誤處理中間件 前端說明提示都沒有&#xff0c;只有一個這個&#xff0c;現在優化一下&#xff0c;再寫一個類似全局后置守衛&#xff0c;當狀態碼是401的時…

RAID 冗余磁盤陣列

RAID也是Linux操作系統中管理磁盤的一種方式。 只有Linux操作系統才支持LVM的磁盤管理方式。 而RAID是一種通用的管理磁盤的技術&#xff0c;使用于多種操作系統。 優勢&#xff1a;提升數據的讀寫速度&#xff0c;提升數據的可靠性。具體實現哪什么功能&#xff0c;要看你所…

RGB樹-美團2023筆試(codefun2000)

題目鏈接 RGB樹-美團2023筆試(codefun2000) 題目內容 塔子哥是一位著名的冒險家&#xff0c;他經常在各種森林里探險。今天&#xff0c;他來到了道成林&#xff0c;這是一片美麗而神秘的森林。在探險途中&#xff0c;他遇到了一棵 n 個節點的樹&#xff0c;樹上每個節點都被涂…

LVGL移植與VS模擬器使用

一、移植文件介紹 二、移植部分 第一步&#xff1a;創建LVGL文件夾 第二步&#xff1a; 構造LVGL文件夾&#xff1a;LVGL - GUI - lvgl - 第三步&#xff1a;添加文件 3.1 從examples中添加2個.c文件 3.2 從src中添加文件 draw文件 extra文件 第四步&#xff1a; 三、Ke…