Linux文本處理三劍客:awk(內置函數詳解筆記)

Linux系統中,AWK 是一個非常強大的文本處理工具,它的內置函數使得對文本數據進行處理更加高效和便捷。

本文將介紹 AWK 內置函數的幾種主要類型:

  • 算數函數
  • 字符串函數
  • 時間函數
  • 位操作函數
  • 其他常用函數

我們將使用一個示例文本文件來演示這些函數的用法,并提供詳細的注釋說明,繼續分享。

基礎學習,可以回頭查看:Linux文本處理三劍客:awk(結構化命令)

1.算數函數

函數名功能參數示例輸出
atan2(y,x)返回正切值 y/x 的角度值,角度以弧度為單位y, xatan2(10, -10) * 180 / PI135
cos(expr)返回 expr 的余弦值,輸入參數以弧度為單位exprcos(60 * PI / 180.0)0.5
exp(expr)返回自然數 e 的 expr 次冪exprexp(5)148.413159
int(expr)返回數值 expr 的整數部分exprint(5.12345)5
log(expr)計算 expr 自然對數exprlog(5.5)1.704748
rand返回一個大于等于 0 小于 1 的隨機數-rand()0.237788
sin(expr)返回角度 expr 的正弦值,角度以弧度為單位exprsin(30 * PI / 180)0.5
sqrt(expr)計算 expr 的平方根exprsqrt(1024.0)32
srand([expr])使用種子值生成隨機數exprsrand(10)1417959587

注釋:

  • 以上表格僅列出了 AWK 提供的內置算術函數。
  • 算術函數的參數必須是數值。
  • 算術函數的返回值是數值。
# 反正切函數
awk 'BEGIN {PI = 3.14159265x = -10y = 10result = atan2 (y,x) * 180 / PI;printf "對于 (x=%f, y=%f),反正切值為 %f 度\n", x, y, result
}'# 余弦函數
awk 'BEGIN {PI = 3.14159265param = 60result = cos(param * PI / 180.0);printf "%f 度的余弦值為 %f\n", param, result
}'# 自然指數函數
awk 'BEGIN {param = 5result = exp(param);printf "%f 的自然指數值為 %f\n", param, result
}'# 取整函數
awk 'BEGIN {param = 5.12345result = int(param)print "Truncated value =", result
}'# 自然對數函數
awk 'BEGIN {param = 5.5result = log (param)printf "log(%f) = %f\n", param, result
}'# 隨機數函數
awk 'BEGIN {print "Random num1 =" , rand()print "Random num2 =" , rand()print "Random num3 =" , rand()
}'#正弦函數
awk 'BEGIN {PI = 3.14159265param = 30.0result = sin(param * PI /180)printf "The sine of %f degrees is %f.\n", param, result
}'# 平方根函數
awk 'BEGIN {param = 1024.0result = sqrt(param)printf "sqrt(%f) = %f\n", param, result
}'# 設置隨機數種子
awk 'BEGIN {param = 10printf "srand() = %d\n", srand()printf "srand(%d) = %d\n", param, srand(param)
}'

2.字符串函數

函數名功能參數示例輸出
asort(arr, [d [, how]])使用 GAWK 值比較的一般規則排序 arr 中的內容arr, d, howasort(arr)-
asorti(arr, [d [, how]])對數組的索引排序arr, d, howasorti(arr)-
gsub(regexp, replacement [, target])全局替換子串regexp, replacement, targetgsub("World", "Jerry", str)Hello, Jerry
index(str, sub)檢測子串是否存在str, subindex(str, subs)5
length(str)返回字符串長度strlength(str)16
match(str, regex)搜索與正則表達式匹配的子串str, regexmatch(str, subs)5
split(str, arr, regex)分割字符串str, arr, regexsplit(str, arr, ",")One, Two, Three, Four
sprintf(format, expr-list)按指定格式構造字符串format, expr-listsprintf("%s", "Hello, World !!!")Hello, World !!!
strtonum(str)將字符串轉換為數值strstrtonum("123")123
sub(regex, sub, string)執行一次子串替換regex, sub, stringsub("World", "Jerry", str)Hello, Jerry
substr(str, start, l)返回子串str, start, lsubstr(str, 1, 5)Hello
tolower(str)將所有大寫字母轉換為小寫字母strtolower(str)hello, world !!!
toupper(str)將所有小寫字母轉換為大寫字母strtoupper(str)HELLO, WORLD !!!

注釋:

  • 以上表格僅列出了 AWK 提供的內置字符串函數。
  • 字符串函數的參數可以是字符串或變量。
  • 字符串函數的返回值是字符串。
# 按字母順序排列數組元素
$ awk 'BEGIN {arr[0] = "Three"arr[1] = "One"arr[2] = "Two"print "排序前數組元素:"for (i in arr) {print arr[i]}asort(arr)print "排序后數組元素:"for (i in arr) {print arr[i]}
}'# 按索引順序排列數組元素
awk 'BEGIN {arr["Two"] = 1arr["One"] = 2arr["Three"] = 3asorti(arr)print "排序后數組索引:"for (i in arr) {print arr[i]}
}'# 替換字符串
awk 'BEGIN {str = "Hello, World"print "替換前字符串 = " strgsub("World", "Jerry", str)print "替換后字符串 = " str
}'# 查找子串的位置
awk 'BEGIN {str = "One Two Three"subs = "Two"ret = index(str, subs)printf "子串 \"%s\" 在第 %d 個位置找到.\n", subs, ret
}'# 獲取字符串長度
awk 'BEGIN {str = "Hello, World !!!"print "長度 = ", length(str)
}'# 使用正則表達式匹配子串
awk 'BEGIN {str = "One Two Three"subs = "Two"ret = match(str, subs)printf "子串 \"%s\" 在第 %d 個位置找到.\n", subs, ret
}'# 將字符串分割為數組
awk 'BEGIN {str = "One,Two,Three,Four"split(str, arr, ",")print "數組包含以下元素:"for (i in arr) {print arr[i]}
}'# 使用 sprintf() 格式化字符串
awk 'BEGIN {str = sprintf("%s", "Hello, World !!!")print str
}'# 將字符串轉換為數字
awk 'BEGIN {print "Decimal num = " strtonum("123")print "Octal num = " strtonum("0123")print "Hexadecimal num = " strtonum("0x123")
}'# 使用 sub() 替換字符串
awk 'BEGIN {str = "Hello, World"print "替換前字符串 = " strsub("World", "Jerry", str)print "替換后字符串 = " str
}'# 獲取子字符串
awk 'BEGIN {str = "Hello, World !!!"subs = substr(str, 1, 5)print "Substring = " subs
}'# 小寫轉換
awk 'BEGIN {str = "HELLO, WORLD !!!"print "Lowercase string = " tolower(str)
}'# 大寫轉換
awk 'BEGIN {str = "hello, world !!!"print "Uppercase string = " toupper(str)
}'

3.時間函數

函數名功能參數示例輸出
systime返回從 Epoch 以來到當前時間的秒數-systime()1418574432
mktime(datespec)將字符串轉換為時間戳datespecmktime("2014 12 14 30 20 10")1418604610
strftime([format [, timestamp[, utc-flag]]])格式化時間戳format, timestamp, utc-flagstrftime("Time = %m/%d/%Y %H:%M:%S", systime())Time = 12/14/2014 22:08:42

注釋:

  • 以上表格僅列出了 AWK 提供的內置時間函數。
  • 時間戳是一個數值,表示從 Epoch 以來經過的秒數。
  • Epoch 是 Unix 時間的起點,為 1970 年 1 月 1 日 00:00:00 UTC。
# 獲取當前時間戳
awk 'BEGIN {print "Number of seconds since the Epoch = " systime()
}'
# 將字符串轉換為時間戳
awk 'BEGIN {print "Number of seconds since the Epoch = " mktime("2014 12 14 30 20 10")
}'# 格式化時間戳
awk 'BEGIN {print strftime("Time = %m/%d/%Y %H:%M:%S", systime())
}'# 打印當前星期幾
awk 'BEGIN {print strftime("%A")
}'

4.位操作函數

函數名功能參數示例輸出
and執行位與操作num1, num2and(10, 6)2
compl按位求補num1compl(10)9.0072E+15
lshift左移位操作num1, shiftlshift(10, 1)20
rshift向右移位操作num1, shiftrshift(10, 1)5
or按位或操作num1, num2or(10, 6)14
xor按位異或操作num1, num2xor(10, 6)12

注釋:

  • 以上表格僅列出了 AWK 提供的內置位操作函數。
  • 位操作函數的參數必須是整數。
  • 位操作函數的返回值是整數。
# 位與操作
awk 'BEGIN {num1 = 10num2 = 6printf "(%d AND %d) = %d\n", num1, num2, and(num1, num2)
}'# 按位求補
awk 'BEGIN {num1 = 10printf "compl(%d) = %d\n", num1, compl(num1)
}'# 左移位操作
awk 'BEGIN {num1 = 10printf "lshift(%d) by 1 = %d\n", num1, lshift(num1, 1)
}'# 向右移位操作。
awk 'BEGIN {num1 = 10printf "rshift(%d) by 1 = %d\n", num1, rshift(num1, 1)
}'# 按位或操作。
awk 'BEGIN {num1 = 10num2 = 6printf "(%d OR %d) = %d\n", num1, num2, or(num1, num2)
}'# 按位異或操作
[jerry]$ awk 'BEGIN {num1 = 10num2 = 6printf "(%d XOR %d) = %d\n", num1, num2, xor(num1, num2)
}'

5.其他常用函數

函數名功能參數示例輸出
close(expr)關閉管道的文件exprclose(cmd, "to")-
delete從數組中刪除元素數組索引delete arr[0]-
exit([expr])終止腳本執行exprexit 10-
fflush([output-expr])刷新打開文件或管道的緩沖區output-exprfflush()-
getline讀入下一行-getline < file-
next停止處理當前記錄,進入下一條記錄的處理過程-if ($0 ~/Shyam/) next-
nextfile停止處理當前文件,從下一個文件第一個記錄開始處理-if ($0 ~ /file1:str2/) nextfile-
return([expr])從用戶自定義的函數中返回值exprreturn result-
system(cmd)執行特定的命令cmdsystem("date")0

釋:

  • 以上表格僅列出了 AWK 提供的其它內置函數。
  • 每個函數的具體使用方法請參考 AWK 官方文檔。
# 關閉管道
awk 'BEGIN {cmd = "tr [a-z] [A-Z]"print "hello, world !!!" |& cmdclose(cmd, "to")cmd |& getline outprint out;close(cmd);
}'# 從數組中刪除元素
awk 'BEGIN {arr[0] = "One"arr[1] = "Two"arr[2] = "Three"arr[3] = "Four"print "刪除前:"for (i in arr) {print arr[i]}delete arr[0]delete arr[1]print "刪除后:"for (i in arr) {print arr[i]}
}'# 終止腳本執行
awk 'BEGIN {print "Hello, World !!!"exit 10print "AWK never executes this statement."
}'# 刷新打開文件或管道的緩沖區
fflush([output-expr])# 讀入下一行
awk '{getline; print $0}' file.txt # 執行特定的命令然后返回其退出狀態。返回值為 0 表示命令執行成功;非 0 表示命令執行失敗。
awk 'BEGIN { ret = system("date"); print "Return value = " ret }'

如果您覺得有些用處,熟練操作這些代碼后,相信你會有一些收獲。

歡迎在評論區留言,關注。謝謝您的閱讀!

敬請關注!

往期學習筆記:

Windows系統開啟Linux子系統(Ubuntu)

Linux常用命令(目錄操作命令)

Linux常用命令:文件的創建、復制、移動、查找和刪除命令

Linux常用命令:文本文件的查看與編輯

Linux常用命令:文本文件的拼接與分割

Linux常用命令:文件的權限管理

Linux常用命令:文件的下載、壓縮與解壓

Linux常用命令:常見的操作符

Linux常用命令:系統操作命令
?

?Linux文本處理三劍客:grep

Linux文本處理三劍客:sed

Linux文本處理三劍客:awk

Linux文本處理三劍客:awk(常用匹配模式)

Linux文本處理三劍客:awk(結構化命令)

Linux文本處理三劍客:awk(對具體文本的示例代碼)

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

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

相關文章

局域網如何搭建服務器?

隨著網絡的普及和應用場景的不斷拓展&#xff0c;局域網搭建服務器逐漸成為大家關注的話題。在日常生活和工作中&#xff0c;我們經常需要通過局域網和互聯網進行文件共享、資源訪問等操作&#xff0c;而搭建服務器則是實現這些功能的重要手段之一。本文將針對局域網搭建服務器…

SwiftUI 如何在運行時從底層動態獲取任何 NSObject 對象實例

概覽 眾所周知,SwiftUI 的推出極大地方便了我們這些禿頭碼農們搭建 App 界面。不過,有時我們仍然需要和底層的 UIKit 對象打交道。比如:用 SwiftUI 未暴露出對象的接口改變視圖的行為或外觀。 從上圖可以看到,我們 SwiftUI 代碼并沒有設置視圖的背景色,那么它是怎么變成綠…

vscode 本地/遠程添加python解釋器

文章目錄 1. 背景2. 增加python解釋器 1. 背景 我們在使用 vscode 去遠程調試代碼時&#xff0c;如果環境存在多個 Python 版本&#xff08;如用 conda 管理&#xff09;&#xff0c;沒有選擇正確的 Python 解釋器會導致少包、庫不適配等各種問題 2. 增加python解釋器 windo…

鴻蒙系統適配的流程

鴻蒙系統適配的流程通常涉及以下關鍵步驟&#xff0c;以下是鴻蒙系統適配的一般流程&#xff0c;具體流程可能會根據項目的具體需求和開發團隊的情況進行調整和優化。北京木奇移動技術有限公司&#xff0c;專業的軟件外包開發公司&#xff0c;歡迎交流合作。 1. 準備工作&#…

超越脆弱:用否定法策略優化考研復試準備

很多情況下,你的想象力會為當前的世界添加一些東西。很抱歉,我會在本章中告訴你,這種方法完全是落后的方法:根據脆弱性和反脆弱性的概念,嚴格來說,正確的想象就是從未來中排除或削減不屬于未來的東西,采用否定法,脆弱的事物終將破碎。——《反脆弱:從不確定性中獲益》…

盤點:國家智能算力中心

文章目錄 1. Main2. My thoughtsReference 1. Main 按照《中國算力白皮書&#xff08;2022年&#xff09;》的定義&#xff0c;算力主要分為四部分&#xff1a;通用算力、智能算力、超算算力、邊緣算力。通用算力以CPU芯片輸出的計算能力為主&#xff1b;智能算力以GPU、FPGA、…

【一起學習Arcade】(6):屬性規則實例_約束規則和驗證規則

一、約束規則 約束規則用于指定要素上允許的屬性配置和一般關系。 與計算規則不同&#xff0c;約束規則不用于填充屬性&#xff0c;而是用于確保要素滿足特定條件。 簡單理解&#xff0c;約束規則就是約束你的編輯操作在什么情況下可執行。 如果出現不符合規則的操作&#…

CGI中使用Cookie

文章目錄 CGI中使用Cookiecookie的語法設置Cookie獲取Cookie檢索Cookie信息文件上傳實例1. 創建HTML表單2. 編寫Python腳本處理上傳 文件下載對話框 CGI中使用Cookie 在CGI&#xff08;Common Gateway Interface&#xff09;中使用Cookie涉及設置和獲取由Web服務器發送到瀏覽器…

java導出多個xml文件的壓縮zip

代碼&#xff1a; // 設置響應頭response.setCharacterEncoding("UTF-8");//設置響應的字符編碼為UTF-8response.setContentType("application/octet-stream");//設置響應的內容類型為二進制流&#xff0c;通常用于文件下載。response.setHeader("Con…

解釋一下前端框架中的虛擬DOM(virtual DOM)和實際DOM(real DOM)之間的關系。

聚沙成塔每天進步一點點 ? 專欄簡介 前端入門之旅&#xff1a;探索Web開發的奇妙世界 歡迎來到前端入門之旅&#xff01;感興趣的可以訂閱本專欄哦&#xff01;這個專欄是為那些對Web開發感興趣、剛剛踏入前端領域的朋友們量身打造的。無論你是完全的新手還是有一些基礎的開發…

leetcode日記(36)全排列

想思路想了很久……思路對了應該會很好做。 我的思路是這樣的&#xff1a;只變化前n個數字&#xff0c;不斷增加n&#xff0c;由2到nums.size()&#xff0c;使用遞歸直到得到所有結果 代碼如下&#xff1a; class Solution { public:vector<vector<int>> permut…

正信法律:借款糾紛的民事起訴狀怎么寫

在借款糾紛中&#xff0c;當協商無果時&#xff0c;訴諸法律成為債權人追回債務的有效途徑。而民事起訴狀作為啟動訴訟程序的法律文書&#xff0c;其撰寫質量直接關系到案件的受理與判決。本文旨在簡明扼要地闡述如何撰寫一份規范的借款糾紛民事起訴狀。 起訴狀需包含以下幾個關…

阿克曼轉向車型導航末段位姿調整控制

1目標 分析RPP算法時控制器算法學習1-RPP受控純追蹤算法發現,在終點時如果角度還有較大偏差,該算法無法進行很好的調整,故開始嘗試在末端接近目標點時,用自己的控制算法去調整位姿,姑且命名為TEA算法(Target-End-Adjust Algorithm for Ackermann) 2控制思路 step1. 將…

【百度】B端數據中臺組_大數據研發工程師(J68899)

北京市技術3人2023-12-14 工作職責&#xff1a; 負責百家號和Feed相關大數據的基礎建設負責數倉引擎、Spark底層的優化和基礎建設為百度系APP相關業務分析及策略優化提供大數據支持參與百度系APP日志數據架構開發和APP端性能分析平臺建設 職責要求&#xff1a; 本科及以上學…

C# Onnx segment-anything 分割萬物 一鍵摳圖

目錄 介紹 效果 模型信息 sam_vit_b_decoder.onnx sam_vit_b_encoder.onnx 項目 代碼 下載 C# Onnx segment-anything 分割萬物 一鍵摳圖 介紹 github地址&#xff1a;https://github.com/facebookresearch/segment-anything The repository provides code for runn…

設計模式(十二)享元模式

請直接看原文: 原文鏈接:設計模式&#xff08;十二&#xff09;享元模式-CSDN博客 -------------------------------------------------------------------------------------------------------------------------------- 享元模式定義 享元模式是結構型設計模式的一種&am…

Kubernetes-1

學習Kubernetes第一天 k8s-11、什么是Kubernetes2、配置Kubernetes2.1、準備三臺全新的虛擬機2.2、關閉防火墻和SElinux2.3、修改主機名2.4、升級操作系統(三臺一起操作)2.5、配置主機hosts文件&#xff0c;相互之間通過主機名互相訪問2.6、配置master和node之間的免密通道2.7、…

KMP算法和Manacher算法

KMP算法 KMP算法解決的問題 KMP算法用來解決字符串匹配問題: 找到長串中短串出現的位置. KMP算法思路 暴力比較與KMP的區別 暴力匹配: 對長串的每個位,都從頭開始匹配短串的所有位. KMP算法: 將短字符串前后相同的部分存儲在 n e x t next next數組里,讓之前匹配過的信息指…

我的單片機入門之旅

我的單片機入門之旅 前言 單片機作為現代電子技術的重要組成部分&#xff0c;廣泛應用于各個領域。而作為一個初學者&#xff0c;我對單片機一無所知。但是&#xff0c;通過不斷的學習和實踐&#xff0c;我逐漸掌握了單片機的基本概念和使用方法。在我的單片機入門之旅中&…

【每日前端面經】2024-03-03

題目來源: 牛客 說說你對Vue3的理解&#xff1f; Vue2面對對象編程&#xff0c;Vue3函數時編程對TS支持的更好選項式API替代組合式API響應式原理由Object.defineProperty變為Proxy支持template中存在多個根節點重寫虛擬DOM增加setup修飾符支持tree-shaking&#xff0c;減小體…