gawk编程
概念
awk 程序是一個用于從大文本中提取數據元素的工具,可以看做是單獨的一門編程語言,而不屬于 shell 腳本。
主要就是用來在大的數據中提取中自己需要的元素(對文本數據的每行進行處理),然后將其格式化,使得重要的數據更易于閱讀。
對于日志以及 CSV 那樣的每行格式相同的文本文件, awk 可能是最方便的工具。
gawk 就是 Unix 下的原始 awk 程序的 GNU 版本。
安裝gawk
在 Ubuntu 中使用 apt 包管理工具安裝(一般都是需要自己手動的安裝,所有的發行版中都沒有默認安裝 gawk 包):
# apt install gawk -y體驗第一次gawk程序
直接在 Linux 終端下輸入 gawk 即可運行 gawk 腳本。也稱為在命令行中直接運行腳本,而不是從程序腳本中讀取很多條語句。這和 shell 一樣,在命令行中可以輸入一條或多條語句進行執行,也可以從 .sh 腳本中運行多個腳本命令。
gawk `{printf("HelloWorld!")}`- 加 單引號 的原因:因為使用了 gawk 命令, 而 gawk 命令行假定后面的內容是單個字符串。而且 gawk 腳本必須放在 {} 中,無論是 BEGIN 塊還是 END 塊。都應該在 {} 中
字段變量
因為 gawk 對文件來說是一行一行的進行處理,所以讀取的默認是一行數據 $0,而每一行又分為很多的段,也就是一句話中有很多的單詞,或者是一行有很多的數據(默認使用的是空格和換行作為字段分隔符)
默認是使用空格或者是換行作為字段之間的分隔符,如果你想使用其他的字段作為分隔符,使用 FS 參數,而且指定輸出字段分隔符使用 OFS 命令。
從文件中讀取腳本
從文件中讀取腳本進行運行,這應該是經常使用的,這里我們在運行時候需要加上參數 -f 用來指定具體的腳本文件:
$ cat test.gawk {testing="This is a test script for gawk"print testing } # gawk -f test.gawk (輸入回車。因為如果不指定要讀取的文件的話,它默認是從stdin進行讀取,所以我們需要輸入點什么東西) This is a test script for gawk結構化命令
gawk 程序和 c 語言的程序特別相像,但是和 shell 腳本不太一樣,比如 if、while 語句,shell 都是 if-then-else-fi 和 while-do-done 結構,但是 gawk 和c 一樣,沒有 then、fi 都能等關鍵字,直接使用大括號將腳本括起來即可。下面詳解:
if語句
if (condition) {statement }例子:
# cat data.txt 10 23 9 32 11 # cat test.gawk {if ($1>5) {print $1} else {x=$1 * 5print x} } # gawk -f test.gawk data.txt 10 # 因為$1 = 10 > 5,所以輸出 $1 = 10,很簡單while 語句
while (condition) {statement }例子:
# cat data.txt 10 23 9 32 11 # cat test.gawk {i=1total=0while (i <= 5) {total += $ii++}print totalavg=total/5print "Average: ", avg } # gawk -f test.gawk data.txt 95 Average: 19for 語句
for 和 C 語言中的語法也是一樣,下面直接以一個例子說明即可:
# cat for_test.gawk {total=0for (i=1; i<4;++i) {total += $i}print "Total: " total }# cat data.txt 1 21 4 5 # gawk -f for_test.gawk data.txt Total: 31函數
內建函數(系統函數)
數學函數
- cos
- sin
- sqrt
- log
- int
- srand
按位運算:
and(v1, v2)、or(v1, v2)、xor(v1, v2)、lshift(v, shift)、rshift(v, shift)
字符串函數
時間函數
- strftime():將當前的時間戳轉化格式化日期 (采用 shell 函數 date() 的格式)
- systime() : 返回當前時間的時間戳
下面是在 gawk 中使用時間函數的例子:
$ gawk `BEGIN{ date=system() day=strftime("%A, %B, %d, %Y", date) print day }`自定義函數
除了 gawk 中的內建函數外,還可以在 gawk 程序中創建自定義函數。
回顧: shell 函數定義
# 方式一: function fun_name {} # 方式二: fun_name() {}但是在 awk 中函數定義和 C 中定義函數差不多,多了關鍵字 function:
function name([variable]) {function body }簡單的例子:
# 腳本文件 # cat function_test.gawk {function printLine() {print $0} } # 文本文件 #cat data.txt this is the first line this is the second line this is the third line # 執行腳本 # gawk -f function_test.gawk data.txt this is the first line this is the second line this is the third line注意: 函數體的大括號不要和 gawk 本身的大括號混淆。各算各的。
函數調用:
調用函數直接使用函數名就可以,還要有函數調用運算符(如果函數有形參的話還要給出實參),但是在 shell 腳本中就只需要函數名,不需要括號。
而且函數的定義要放在所有的代碼塊之前(包括BEGIN 代碼塊)。
例子:
# cat fun_test.gawk一旦定義了函數,你就能在程序的代碼中隨意使用。在設計很大的代碼量時,這會省去很多的工作。
總結
- 上一篇: 10 分钟了解 Flutter 跨平台方
- 下一篇: wordpress企业网站模板