日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

gawk编程

發布時間:2023/12/20 编程问答 67 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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: 19

for 語句

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

一旦定義了函數,你就能在程序的代碼中隨意使用。在設計很大的代碼量時,這會省去很多的工作。

總結

以上是生活随笔為你收集整理的gawk编程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。