awk的內建函數
1. 字符串函數
sub函數匹配記錄中最大、最靠左邊的子字符串的正則表達式,並用替換字符串替換這些字符串。如果沒有指定目標字符串就默認使用整個記錄。替換只發生在第一次匹配的時候。格式如下:
sub (regular expression, substitution string):
sub (regular expression, substitution string, target string)
實例:
$ awk '{ sub(/test/, "mytest"); print }' testfile
$ awk '{ sub(/test/, "mytest"); $1}; print }' testfile
第一個例子在整個記錄中匹配,替換只發生在第一次匹配發生的時候。如要在整個文件中進行匹配需要用到gsub
第二個例子在整個記錄的第一個域中進行匹配,替換只發生在第一次匹配發生的時候。
gsub函數作用如sub,但它在整個文檔中進行匹配。格式如下:
gsub (regular expression, substitution string)
gsub (regular expression, substitution string, target string)
實例:
$ awk '{ gsub(/test/, "mytest"); print }' testfile
$ awk '{ gsub(/test/, "mytest"), $1 }; print }' testfile
第一個例子在整個文檔中匹配test,匹配的都被替換成mytest。
第二個例子在整個文檔的第一個域中匹配,所有匹配的都被替換成mytest。
index函數返回子字符串第一次被匹配的位置,偏移量從位置1開始。格式如下:
index(string, substring)
實例:
$ awk '{ print index("test", "mytest") }' testfile
實例返回test在mytest的位置,結果應該是3。
length函數返回記錄的字符數。格式如下:
length( string )
length
實例:
$ awk '{ print length( "test" ) }'
$ awk '{ print length }' testfile
第一個實例返回test字符串的長度。
第二個實例返回testfile文件中第條記錄的字符數。
substr函數返回從位置1開始的子字符串,如果指定長度超過實際長度,就返回整個字符串。格式如下:
substr( string, starting position )
substr( string, starting position, length of string )
實例:
$ awk '{ print substr( "hello world", 7,11 ) }'
上例截取了world子字符串。
match函數返回在字符串中正則表達式位置的索引,如果找不到指定的正則表達式則返回0。match函數會設置內建變量RSTART為字符串中子字符串的開始位置,RLENGTH為到子字符串末尾的字符個數。substr可利於這些變量來截取字符串。函數格式如下:
match( string, regular expression )
實例:
$ awk '{start=match("this is a test",/[a-z]+$/); print start}'
$ awk '{start=match("this is a test",/[a-z]+$/); print start, RSTART, RLENGTH }'
第一個實例打印以連續小寫字符結尾的開始位置,這裡是11。
第二個實例還打印RSTART和RLENGTH變量,這裡是11(start),11(RSTART),4(RLENGTH)。
toupper和tolower函數可用於字符串大小間的轉換,該功能只在gawk中有效。格式如下:
toupper( string )
tolower( string )
實例:
$ awk '{ print toupper("test"), tolower("TEST") }'
split函數可按給定的分隔符把字符串分割為一個數組。如果分隔符沒提供,則按當前FS值進行分割。格式如下:
split( string, array, field separator )
split( string, array )
實例:
$ awk '{ split( "20:18:00", time, ":" ); print time[2] }'
上例把時間按冒號分割到time數組內,並顯示第二個數組元素18。
2. 時間函數
systime函數返回從1970年1月1日開始到當前時間(不計閏年)的整秒數。格式如下:
systime()
實例:
$ awk '{ now = systime(); print now }'
strftime函數使用C庫中的strftime函數格式化時間。格式如下:
systime( [format specification][,timestamp] )
實例:
$ awk '{ now=strftime( "%D", systime() ); print now }'
$ awk '{ now=strftime("%m/%d/%y"); print now }'
mktime:
mktime("年 月 日 時 分 秒") 返回指定時間與1970-1-1 00:00:00 之間相差的秒數
echo "" | awk 'BEGIN{print strftime("%Y-%m-%d %T",mktime("2011 01 01 13 00 00")+60)}'