awk 語法深入 使用者自定義函式

2021-07-17 03:34:46 字數 2606 閱讀 1065

- 自定義函式格式

awk 自定義函式獲取引數,選擇性的返回標量值,函式可以在程式的頂層任意位置定義。自定義格式為:

function name

(arg1

,arg2

,....

argn

)

在自定義的函式中,指定的引數被當作區域性變數,他們會隱藏任何同名的全域性性變數。

呼叫函式的格式:

function

(expr1

,expr2

,...)

# 忽略任何返回值

result

=function

(expr1

,expr2

,...)

# 將返回值儲存在變數中

自定義函式時,所有位於函式體內部且未出現在函式引數列表中的變數,awk都將視之為全域性變數。

awk允許呼叫函式時,被呼叫函式中的引數比它定義時所宣告的引數還少,這樣額外的引數(既沒有被傳遞值的引數)被視為區域性變數,對於這類變數,一般將它列在自定義的函式的引數列表,並且字首前置一些空白。這個額外的引數通常初始化為空字串.

eg.

funchtion add(x

,y  sum

) // sum 就是乙個區域性變數,初始化為空字串

a

=add(1

,2)// 傳遞的引數少於函式add()定義時的數量

printf

("m: %d\n",a

)

- 值傳遞和位址傳遞(引用傳遞):

值傳遞是將變數的值傳給了函式的形參,變數本身並未改變,還是原來的值。

位址傳遞是將變數的位址傳遞給了函式的形參,被呼叫函式會通過變數的位址找到變數被定義的地方,進而對變數作出改動,與變數的值改變。

awk不支援取址操作,因此awk中普通變數為值傳遞,awk的陣列則預設為位址傳遞。

- 遞迴呼叫

awk函式支援自己呼叫自己。

應用場景: 某些不斷執行相同邏輯的的程式.

eg. 求斐波那契數列(fibonacci sequence)的某一項

fibonacci.awk

function fibonacci

(nth

)

######執行體###########################

問題: 複雜度大,求第n項時需要把前n-1項都計算一遍!

解決:使用陣列,把所有求過的項儲存起來,再求新的項時,直接呼叫。

總結: print 與 printf 的區別:

print 輸出的內容後會自動換行

printf 不會自動換行,需要新增'\n';還可以自定義輸出格式.

[

root@web1

function

]#echo -e

"1\n2\n34\n43\n23"

|awk

''

numberis:

1

numberis:

2

numberis:

34

numberis:

43

numberis:

23

[

root@web1

function

]#echo -e

"1\n2\n34\n43\n23"

|awk

' end'

numberis:

1numberis:

2numberis:

34numberis:

43numberis:

23

[

root@web1

function

]#echo -e

"1\n2\n34\n43\n23"

|awk

''

numberis:

1

numberis:

2

numberis:

34

numberis:

43

numberis:

23

awk中自定義函式

awk中自定義函式 定義和呼叫使用者自己的函式是幾乎每個高階語言都具有的功能,awk也不例外,但原始的awk並不提供函式功能,只有在nawk或較新的awk版本中才可以增加函式。函式的使用包含兩部分 函式的定義與函式呼叫。其中函式定義又包括要執行的 函式本身 和從主程式 傳遞到該函式的臨時呼叫。awk...

使用者自定義函式

create function 架構名.function name 傳入變數1 變數 型別,傳入變數2 變數 型別.returns return date type asbegin declare the return variable here declare variable1 variable...

使用者自定義函式

舉例來說明 cat datafile northwest nw joel craig 3.0 98 3 4 western we sharon kelly 5.3 97 5 23 southwest sw chris foster 2.7 8 2 18 southern so may chin 5....