awk是命令還是程式語言

2021-08-27 20:06:49 字數 4324 閱讀 6762

一,什麼是awkawk是linux下的乙個命令,他對其他命令的輸出,對檔案的處理都十分強大,其實他 更像一門程式語言,他可以自定義變數,有條件語句,有迴圈,有陣列,有正則,有函式等。他讀取輸出,或者檔案的方式是一行,一行的讀,根據你給出的條件進 行查詢,並在找出來的行中進行操作,感覺他的設計思想,真的很簡單,但是結合實際情況,具體操作起來就沒有那麼簡單了。他有三種形 勢,awk,gawk,nawk,平時所說的awk其實就是gawk。

二,awk中的記錄,域,分割符

當我們讀取輸出時,或者讀取檔案時,讀取一行就是乙個記錄。記錄分割符是預設是回車符,儲存在rs,ors中。

我們從記錄中分割出我們要單詞,或者是片語等,我們稱他為域,域分割符,預設的是空格和tab銉,儲存在內建變

量ors中。舉個例子:

aaaa:bbbb:ccccccc

1111:2343:5t43343

上面有二行,這二行就是二個記錄,每行後面的回車呢,就是記錄分割符,裡面冒號呢,就是域分割符,分割出來的,aaaa,1111這類東西就是域了。

awk -f: '' testfile

三,awk的內建變數和運算子

1,變數

變 量描述

$n當前記錄的第n個字段,欄位間由 fs分隔。

$0完整的輸入記錄。

argc

命 令行引數的數目。

argind

命令列中當前檔案的位置(從0開始算)。

argv

包 含命令列引數的陣列。

convfmt

數字轉換格式(預設值為%.6g)

environ

環 境變數關聯陣列。

errno

最後乙個系統錯誤的描述。

fieldwidths

字 段寬度列表(用空格鍵分隔)。

filename

當前檔名。

fnr同 nr,但相對於當前檔案。

fs欄位分隔符(預設是任何空格)。

ignorecase

如 果為真,則進行忽略大小寫的匹配。

nf當前記錄中的字段數。

nr當 前記錄數。

ofmt

數字的輸出格式(預設值是%.6g)。

ofs輸 出欄位分隔符(預設值是乙個空格)。

ors輸出記錄分隔符(預設值是乙個換行符)。

rlength

由 match函式所匹配的字串的長度。

rs記錄分隔符(預設是乙個換行符)。

rstart

由 match函式所匹配的字串的第乙個位置。

subsep

陣列下標分隔符(預設值是\034)。

2,運算子

運算子描述= += -= *= /= %= ^= **=

賦值?:

c條件表示式

||邏 輯或

&&邏輯與

~ ~!

匹 配正規表示式和不匹配正規表示式

< <= > >= != ==

關 系運算子

空格連線

+ -加,減

* / &

乘,除與求餘

+ - !

一元加,減和邏輯非

^ ***

求冪++ --

增加或減少,作為字首或字尾

$字 段引用

in陣列成員

四,awk的正則

匹配符描述\y

匹配乙個單詞開頭或者末尾的空字串

\b匹配單詞內的空字串

\<

匹配乙個單詞的開頭的空字串,錨定開始

\>

匹配乙個單詞的末尾的空字串,錨定末尾

\w匹配乙個非字母數字組成的單詞

\w匹配乙個字母數字組成的單詞

\'匹配字串末尾的乙個空字串

\『匹配字串開頭的乙個空字串

五,awk的函式

1,字串函式

函式名描述sub

匹配記錄中最大、最靠左邊的子字串的正規表示式,並用替換字串替換這些字串。如果沒有指定目標字串就預設使用整個記錄。替換只發生在第一次匹配的 時候

gsub

整個文件中進行匹配

index

返回子字串第一次被匹配的位置,偏移量從位置1開始

substr

返回從位置1開始的子字串,如果指定長度超過實際長度,就返回整個字串

split

可按給定的分隔符把字串分割為乙個陣列。如果分隔符沒提供,則按當前fs值進行分割

length

返回記錄的字元數

match

返回在字串中正規表示式位置的索引,如果找不到指定的正規表示式則返回0。match函式會設定內建變數rstart為字串中子字串的開始位 置,rlength為到子字串末尾的字元個數。substr可利於這些變數來擷取字串

toupper和tolower

可用於字串大小間的轉換,該功能只在gawk中有效

2,數學函式

函式名返回值atan2(x,y)

y,x 範圍內的餘切

cos(x)

余弦函式

exp(x)

求 冪int(x)

取整log(x)

自然對 數

rand()

隨機數sin(x)

正弦sqrt(x)

平 方根

srand(x)

x是rand()函式的種子

int(x)

取 整,過程沒有捨入

rand()

產生乙個大於等於0而小於1的隨機數

六,例項

學習awk的時候,做了乙個例子,學東西,不要光看,光看是記不住東西的。光看的話,也許你知道怎麼回事,真正實際操作,不是這兒有問題,就是那兒有問題。所以一定要動手親自操作一下。

1,測試檔案test

例1:

cat test | awk -f: 'else if($1 == "bin")else \

}'

例2:

awk '}}'
例4:

ls -al /home/zhangy/mytest | awk 'begin

}'

例5:

echo "32:34" |awk -f: '\

function max(one,two)else

}'

例6:

#awk 'begin$1 ~nameend' test

#awk '' test

#awk ';print}' test

#awk ';print}' test

#awk -f: '' test

#awk -f: '' test

awk -f: '' test

例7:

cat test |awk -f: '\

nf != 7\

$1 !~ /^[a-za-z0-9]/\

$2 == "*" '

awk是命令還是程式語言

一,什麼是awk awk是linux下的乙個命令,他對其他命令的輸出,對檔案的處理都十分強大,其實他更像一門程式語言,他可以自定義變數,有條件語句,有迴圈,有陣列,有正則,有函式等。他讀取輸出,或者檔案的方式是一行,一行的讀,根據你給出的條件進行查詢,並在找出來的行中進行操作,感覺他的設計思想,真的...

shell程式設計之awk命令詳解

shell程式設計之awk命令詳解 linux 本篇部落格主要介紹linux常用命令中的對文字和資料進行處理的命令awk的用法。awk命令 awk是一種程式語言,用於在linux unix下對文字和資料進行處理。資料可以來自標準輸入 stdin 乙個或多個檔案,或其它命令的輸出。它支援使用者自定義函...

什麼是程式語言

什麼是程式語言?學習程式語言之前,首先要搞清楚 程式語言 這個概念。很小的時候,父母就教我們開口說話,也教我們如何理解別人講話的意思。經過長時間的薰陶和自我學習,我們竟然在不知不覺中學會了說話,同時也能聽懂其他小朋友說話的意思了,我們開始向父母要零花錢買零食和玩具 被欺負了向父母傾訴 我們說的是漢語...