awk:FIELDWIDTHS、sub、gsub、gensub、strftime、mktime、asort、asorti

GNU awk扩展正则补充,对其它GNU的程序也通用:
   \w任何可以做单词组成成分的字符匹配(字母、数字、下划线)
   \W和\2相反
   \<匹配单词的开头
   \>匹配单词的结尾
   \y匹配一个单词的开头和结尾,例:\yballs?\y
   \B匹配单词内部的字符,例:\Bxx\B匹配 axxa但是不匹配a xx a

分隔字段:
   1、使用FS指定分隔符,如果指定为空客串时,那么记录中每个字符都成为一个独立的字段
   2、使用变量FIELDWIDTHS指定固定宽度的字段,例:FIELDWIDTHS = "3 3 8 8"(空格也被视为一个字符的长度)

忽略大小写
   IGNORECASE默认值为0不忽略大小写;值非零忽略大小写

ERRNO
   设置getline重定向和close()期间的错误描述。

补充函数:

   sub(r,s,t)替换首次匹配,成功返回1,否则返回0,没有给出t使用$0

   gsub(r,s,t)替换所有匹配,返回替换的个数,没有给出t使用$0

   gensub(r,s,h,t)指定在t中替换第h次匹配的r为字符串s,和sub\gsub的主要不同是,该函数不会改变输出的字符串,新字符串为返回值。
   [root@localhost upload]# echo yes no | gawk '{print gensub(/(yes) (no|NO)/,"\\2","g")}'
   no
   [root@localhost upload]# echo yes no | gawk '{print gensub(/(yes) (no|NO)/,"&\\\\ haha","g")}'
   yes no\ haha


两个时间函数:
   systime():返回1970至今的秒数
   strftime(format,timestamp):依照format格式化,timestamp(如果没有timestamp则

   使用当前时间)。如果也没有format,经测试用默认格式和date输出相同。
   [root@localhost upload]# awk 'BEGIN {print strftime("%Y-%m-%d %H:%M:%S",88888888)}'
   1972-10-26 03:21:28
   [root@localhost upload]# awk 'BEGIN {print strftime("%y-%m-%d %H:%M:%S",88888888)}'
   72-10-26 03:21:28
   [root@localhost upload]# awk 'BEGIN {print strftime("%y-%m-%d %H:%M:%S")}'
   13-06-16 21:33:47


mktime返回指定日期指定时间的时间戳,例:

$ export TZ=UTC
$ awk 'BEGIN{print mktime("1970 01 01 00 00 00")}'
0

$ export TZ=UTC8
$ awk 'BEGIN{print mktime("1970 01 01 00 00 00")}'
28800

$ export TZ=UTC-8
$ awk 'BEGIN{print mktime("1970 01 01 00 00 00")}'
-28800


mktime 例2:mktime一定不能使用这种形式:2015-01-12 15 25 36

[yangjuying@CHN-JXQ-MD09-B03-09 ~]$ awk 'BEGIN{print mktime("2015-01-12 15 25 36")}'
1413703536
[yangjuying@CHN-JXQ-MD09-B03-09 ~]$ awk 'BEGIN{print mktime("2015 01 12 15 25 36")}'
1421047536



awk排序函数(asort和asorti):

a[5]=6

a[2]=8

a[1]=5

len=asort(a,Sa)

len=asorti(a,Sa)

两者的区别在于:

asort只对a的值进行排序,并以新的下标(从1开始)把a的每个元素的值存入Sa数据组中,使用for循环遍历;

asorti只对a的下标进行排序,并以新的下标(从1开始)把a的下标存入Sa数据组中,使用for循环遍历。



你可能感兴趣的:(strftime,mktime,gensub,FIELDWIDTHS)