linux 命令詳解 十二

     7.  內建函數:

    字符串函數
    sub(regular expression,substitution string);
    sub(regular expression,substitution string,target string);

    /> awk '{sub("Tom","Tommy"); print}' employees   #這裏使用Tommy替換了Tom
    Tommy Jones       4424    5/12/66         543354

    #
當正則表達式Tom在第一個域中第一次被匹配後,他將被字符串"Tommy"替換,如果將sub函數的第三個參數改爲$2,將不會有替換髮生。
    /> awk '{sub("Tom","Tommy",$1); print}' employees
    Tommy Jones       4424    5/12/66         543354

    gsub(regular expression,substitution string);
    gsub(regular expression,substitution string,target string);
    
sub不同的是,如果第一個參數中正則表達式在記錄中出現多次,那麼gsub將完成多次替換,而sub只是替換第一次出現的。

    index(string,substring)
    
該函數將返回第二個參數在第一個參數中出現的位置,偏移量從1開始。
    /> awk 'BEGIN{print index("hello","el")}'
    2

    length(string)
    
該函數返回字符串的長度。
    /> awk 'BEGIN{print length("hello")}'
    5

    substr(string,starting position)
    substr(string,starting position,length of string)
    
該函數返回第一個參數的子字符串,其截取起始位置爲第二個參數(偏移量爲1),截取長度爲第三個參數,如果沒有該參數,則從第二個參數指定的位置起,直到string的末尾。
    />  awk 'BEGIN{name = substr("Hello World",2,3); print name}'
    ell

    match(string,regular expression)
    
該函數返回在字符串中正則表達式位置的索引,如果找不到指定的正則表達式就返回0.match函數設置內置變量RSTART爲字符串中子字符串的開始位置,RLENGTH爲到字字符串末尾的字符個數。
    /> awk 'BEGIN{start=match("Good ole CHINA", /[A-Z]+$/); print start}'
    10
    
上例中的正則表達式[A-Z]+$表示在字符串的末尾搜索連續的大寫字母。在字符串"Good ole CHINA"的第10個位置找到字符串"CHINA"

    /> awk 'BEGIN{start=match("Good ole CHINA", /[A-Z]+$/); print RSTART, RLENGTH}'
    10 5
    RSTART
表示匹配時的起始索引,RLENGTH表示匹配的長度。

    /> awk 'BEGIN{string="Good ole CHINA";start=match(string, /[A-Z]+$/); print substr(string,RSTART, RLENGTH)}'
    CHINA
    
這裏將matchRSTARTRLENGTHsubstr巧妙的結合起來了。

    toupper(string)
    tolower(string)
    
以上兩個函數分別返回參數字符串的大寫和小寫的形式。
    /> awk 'BEGIN {print toupper("hello"); print tolower("WORLD")}'
    HELLO
    world

    split(string,array,field seperator)
    split(string,array)
    
該函數使用作爲第三個參數的域分隔符把字符串分隔爲一個數組。如果第三個參數沒有提供,則使用當前默認的FS值。
    /> awk 'BEGIN{split("11/20/2011",date,"/"); print date[2]}'
    20

    variable = sprintf("string with format specifiers ",expr1,expr2,...)
    
該函數和printf的差別等同於C語言中printfsprintf的差別。前者將格式化後的結果輸出到輸出流,而後者輸出到函數的返回值中。
    /> awk 'BEGIN{line = sprintf("%-15s %6.2f ", "hello",4.2); print line}'
    hello             4.20

    
時間函數:
    systime()
    
該函數返回當前時間距離197011日之間相差的秒數。
    /> awk 'BEGIN{print systime()}'
    1321369554

    strftime()
    
時間格式化函數,其格式化規則等同於C語言中的strftime函數提供的規則,見以下列表:

數據格式

含義

%a

Abbreviated weekday name

%A

Full weekday name

%b

Abbreviated month name

%B

Full month name

%c

Date and time representation appropriate for locale

%d

Day of month as decimal number (01 – 31)

%H

Hour in 24-hour format (00 – 23)

%I

Hour in 12-hour format (01 – 12)

%j

Day of year as decimal number (001 – 366)

%m

Month as decimal number (01 – 12)

%M

Minute as decimal number (00 – 59)

%p

Current locale's A.M./P.M. indicator for 12-hour clock

%S

Second as decimal number (00 – 59)

%U

Week of year as decimal number, with Sunday as first day of week (00 – 53)

%w

Weekday as decimal number (0 – 6; Sunday is 0)

%W

Week of year as decimal number, with Monday as first day of week (00 – 53)

%x

Date representation for current locale

%X

Time representation for current locale

%y

Year without century, as decimal number (00 – 99)

%Y

Year with century, as decimal number

    /> awk 'BEGIN{ print strftime("%D",systime())}'
    11/15/11
    /> awk 'BEGIN{ now = strftime("%T"); print now}'
    23:17:29

    
內置數學函數:

名稱

返回值

atan2(x,y)

y,x範圍內的餘切

cos(x)

餘弦函數

exp(x)

求冪

int(x)

取整

log(x)

自然對數

sin(x)

正弦函數

sqrt(x)

平方根

    /> awk 'BEGIN{print 31/3}'
    10.3333
    /> awk 'BEGIN{print int(31/3)}'
    10

    
自定義函數:
    
自定義函數可以放在awk腳本的任何可以放置模板和動作的地方。
    function name(parameter1,parameter2,...) {
        statements
        return expression
    }
    
給函數中本地變量傳遞值。只使用變量的拷貝。數組通過地址或者指針傳遞,所以可以在函數內部直接改變數組元素的值。函數內部使用的任何沒有作爲參數傳遞的變量都被看做是全局變量,也就是這些變量對於整個程序都是可見的。如果變量在函數中發生了變化,那麼就是在整個程序中發生了改變。唯一向函數提供本地變量的辦法就是把他們放在參數列表中,這些參數通常被放在列表的最後。如果函數調用沒有提供正式的參數,那麼參數就初始化爲空。return語句通常就返回程序控制並向調用者返回一個值。
    /> cat grades
    20 10
    30 20
    40 30

    /> cat add.sc
    function add(first,second) {
            return first + second
    }
    { print add($1,$2) }

    /> awk -f add.sc grades
    30
    50
    70

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章