2014年六月

awk中ord的实现:将字符转化对应的ascii码

在awk中并未直接提供ord函数,所以在将某个字符转换为码时,需要自己来实现


awk 'BEGIN{for (i = 0; i < 256; ++i) {ord[sprintf("%c", i)] = i;} }'  ' { print ord['a'];  ord ['b']; }'

这里主要是构造了ord为key,val的数据结构,key为char字符,val对应的ascii码



awk学习笔记之正则表达式

正则在Awk中用处比较多,这里就其主要用法做个大概的介绍。

  • 使用正则

awk中的regexp是用斜线包括,如/xx/, 就是一个比较简单的正则

awk '/foo/ {print $2}'

上面的示例是每行的记录只要包括foo字符串的,就将其第二个字段打印

注:/foo/ : 是指只要记录包含子串即可,不管其出现的位置

  • 两种匹配方式~  !~
  1. str ~ /regexp/    str匹配正则表达式时,返回true
  2. str !~  /regexp/   str不匹配正则表达式时,返回true
  • 正则中的转义字符
    对于一些非可打印的字符,使用\进行转义。
    如 \t : 代表tab  \\  代表\,   \*代表*
  • 正则中使用的operator
    1. ^ : 头部开始匹配
      如^Sep :  则str必须以Sep开头,正则匹配才会返回true
    2. $ :  尾部匹配
      如end$ :  则str必须以end结尾,则正匹配才会返回true
    3. . : 匹配任意的字符
    4. [...] : 匹配[]包含字符的某一个
      如[0-9] 匹配任意的一个数字
      [a-zA-Z] 匹配任意的字母
      [MVX] 匹配字符’M’ ‘V’ ‘X’中的某一个
      内置的表示:[:alnum:] 代表所有的字母和数字,[:alpha:] 代表所有的字母  [:digit:] 代表所有的数字
    5. [^...] : 中括号中加入^, 匹配非[]内的所有字符
    6. | : 或的关系,^P | [0-9] 匹配所有的以P开头的字符串,或者包含数字的字符串
      注:| 的优先级最低
    7. () : 将正则括起来
    8. 出现次数的operator: * + ? {m,n}
  • awk的正则匹配是大小写敏感,可使用tolower(str) ~ /regexp/

参考文章:http://www.math.utah.edu/docs/info/gawk_5.html



awk学习笔记【一】

今天主要介绍下awk中内置的String函数和awk中内置的变量。

awk中内置的string函数

  • index(in, find): 在 string “in”中查找 find 的第一次出现位置,返回的find在in中第一个字符出现的位置,从1开始
    awk 'BEGIN { print index("peanut", "an") }'
    # 打印3
    
  • length(string) : 返回字符串的长度,如果是number类型,返回对应字符的长度
  • match(string, regexp) : 正则匹配regexp的规则,如果匹配,则返回对应第一个字符的位置
  • split(string, array, fieldsep) : 按照fieldsep分割字符串,并将结果放置到array中,array的下标从1开始
    split("yaronspace.cn", fields, ".")
    # fields[1] = "yaronspace"
    # fields[2] = "cn"
    
  • sprintf(format, expression1, …): 格式化字符串
  • sub(regexp, replacement, target): 将第一个匹配的regexp的部分使用replacement替代,替代后的结果还是保存在target变量中。所以target必须是变量,不可为字符常量
    str = "yaronspace.cn";
    sub(/yaronspace/, "xiaofangdeng", str);
    # str="xiaofengdeng.cn"
    

    使用&符号引用匹配regexp部分的字符长,示例如下:

    str = "yaronspace.cn";
    sub(/yaronspace/, "&_xiaofangdeng", str);
    # str = "yaronspace_xiaofangdeng.cn"
    
  • gsub(regexp, replacement, target):  与sub功能类似,但是会替换所有匹配regexp的子串,g代表”global”的含义
  • substr(string, start, length) : 获取子串
  • tolower(string) : 转化为小写
  • toupper(string) : 转化为大写

awk中内置的变量

  • FS: Input Field Seperator variable: 对每行记录的分割符,可以通过-F参数修改,或者在awk文件中,直接使用FS=”XX”进行修改
  • OFS : Output Field Seperator variabble: 输出时默认每个记录的分隔符,默认为空格
    $ awk -F':' '{print $3,$4;}' /etc/passwd   # $3 $4以空格分割
    $ awk -F':' 'BEGIN{OFS="_"} {print $3, $4}' # 此时$3 $4是以_分割
    
  • RS : Input Record Seperator variable: 记录的默认分隔符,默认为\n换行符
    可以修改,如将其修改为\n\n,以两个空行为分隔符
  • ORS: Ouput Record Seperator variable: 默认的记录的输出的分隔符,默认为\n
  • NR: Number of records variable: 当前已读取记录数,默认情况为当前的行数
  • NF: Number of fields vairable : 当前记录的域的个数
  • FILENAME : Name of the current input file
  • FNR: Number of Records relative to the current input file : 当awk的输入文件只有一个时,NR == FNR;当awk的输入文件时多个时,FNR是当前文件的当前行数,NR是全局的行数

参考文章:

1. http://www.staff.science.uu.nl/~oostr102/docs/nawk/nawk_92.html

2. http://www.thegeekstuff.com/2010/01/8-powerful-awk-built-in-variables-fs-ofs-rs-ors-nr-nf-filename-fnr/