码迷,mamicode.com
首页 > 其他好文 > 详细

awk笔记

时间:2015-02-05 18:18:57      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:

 awk:
  • awk名来:三个人名的缩写,他们是:Aho、(Peter)Weinberg 和(Brain)Kernighan;
  • 行处理时可以处理行内字段,这是grep/sed搞不定的;特殊地,用$0表示正行;
  • 用法:awk [ -F re] [parameter...] [‘prog‘] [-f progfile][in_file...]
    • -F 列分隔符;
    • prog:‘pattern {action}‘,pattern是特定字符串,支持正则,如cat uids | awk ‘/[0-9]+\.[0-9]*/{print}‘;
    • -f:符合awk语法的脚本文件;
    • in_file:输入文件,允许多个输入文件;???
  • pattern字符表示:
    • \ 换码序列
    • ^ 在字符串的开头开始匹配
    • $ 在字符串的结尾开始匹配
    • . 与任何单个字符串匹配
    • [ABC] 与[]内的任一字符匹配
    • [A-Ca-c] 与 A-C 及 a-c 范围内的字符匹配(按字母表顺序)
    • [^ABC] 与除[]内的所有字符以外的任一字符匹配
    • Desk|Chair 与 Desk 和 Chair 中的任一个匹配
    • [ABC][DEF] 关联。与 A、B、C 中的任一字符匹配,且其后要跟 D、E、F 中的任一个字符。
    • [ABC]* 与 A、B 或 C 中任一个出现 0 次或多次的字符相匹配
    • [ABC]+ 与 A、B 或 C 中任何一个出现 1 次或多次的字符相匹配
    • ? 与一个空串或 A、B 或 C 在任何一个字符相匹配
    • (Blue|Black)berry 合并常规表达式,与 Blueberry 或 Blackberry 相匹配 
  • 算术运算符:
    • x^y x 的 y 次幂
    • x**y 同上
    • x%y 计算 x/y 的余数(求模)
    • x+y x 加 y
    • x-y x 减 y
    • x*y x 乘 y
    • x/y x 除 y
    • -y 负 y(y 的开关符号);也称一目减
      ++y y 加 1 后使用 y(前置加)
    • y++ 使用 y 值后加 1(后缀加)、
    • --y y 减 1 后使用 y(前置减)
    • y-- 使用后 y 减 1(后缀减)
    • x=y 将 y 的值赋给 x
    • x+=y 将 x+y 的值赋给 x
    • x-=y 将 x-y 的值赋给 x
    • x*=y 将 x*y 的值赋给 x
    • x/=y 将 x/y 的值赋给 x
    • x%=y 将 x%y 的值赋给 x
    • x^=y 将 x^y 的值赋给 x
    • x**=y 将 x**y 的值赋给 x
  • 逻辑运算符:
    • x==y
    • x!=y
    • x>y
    • x>=y
    • x<y
    • x<=y
    • x~re
    • x!~re
  •  内置变量:
    • ARGC: 命令行参数的数目。
    • ARGIND: 命令行中当前文件的位置(从0开始算)。
    • ARGV: 包含命令行参数的数组。
    • CONVFMT: 数字转换格式(默认值为%.6g)
    • ENVIRON: 环境变量关联数组。
    • ERRNO: 最后一个系统错误的描述。
    • FIELDWIDTHS: 字段宽度列表(用空格键分隔)。
    • FILENAME: 当前文件名。
    • FNR: 同NR,但相对于当前文件。
    • FS: 字段分隔符(默认是任何空格)。
    • IGNORECASE: 如果为真,则进行忽略大小写的匹配。
    • NF: 当前记录中的字段数。
    • NR: 当前记录数。
    • OFMT: 数字的输出格式(默认值是%.6g)。
    • OFS: 输出字段分隔符(默认值是一个空格)。
    • ORSL : 输出记录分隔符(默认值是一个换行符)。
    • RLENGTH: 由match函数所匹配的字符串的长度。
    • RS: 记录分隔符(默认是一个换行符)。
    • RSTART: 由match函数所匹配的字符串的第一个位置。
    • SUBSEP: 数组下标分隔符(默认值是\034)
  • 内置函数:类C风格用法;
    • printf:格式化输出,比如 awk ‘{printf "%03d%s\n",NR,$1}‘ myfile
    • N gsub(reg,string,target) 每次常规表达式 reg 匹配时替换 target 中的 string
    • N index(search,string) 返回 string 中 search 串的位置
    • A length(string) 求串 string 中的字符个数
    • N match(string,reg) 返回常规表达式 reg 匹配的 string 中的位置
    • N printf(format,variable) 格式化输出,按 format 提供的格式输出变量 variable。
    • N split(string,store,delim) 根据分界符 delim,分解 string 为 store 的数组元素
    • N sprintf(format,variable) 返回一个包含基于 format 的格式化数据,variables 是要放到串中的数据
    • G strftime(format,timestamp) 返 回 一 个 基 于 format 的 日 期 或 者 时 间 串 ,timestmp 是 systime()函数返回的时间
    • N sub(reg,string,target) 第一次当常规表达式 reg 匹配,替换 target 串中的字符串
    • A substr(string,position,len) 返回一个以 position 开始 len 个字符的子串
    • P tolower(string) 返回 string 中对应的小写字符
    • P toupper(string) 返回 string 中对应的大写字符
    • A atan(x,y) x 的余切(弧度)
    • N cos(x) x 的余弦(弧度)
    • A exp(x) e 的 x 幂
    • A int(x) x 的整数部分
    • A log(x) x 的自然对数值
    • N rand() 0-1 之间的随机数
    • N sin(x) x 的正弦(弧度)
    • A sqrt(x) x 的平方根
    • A srand(x) 初始化随机数发生器。如果忽略 x,则使用 system()
    • G system() 返回自 1970 年 1 月 1 日以来经过的时间(按秒计算)
  • 流程控制:
    • 逻辑运算符:......
    • BEGIN/END:
    • if-else:
    • while/do-while/for/
    • break/continue/exit(退出但不跳过END)
    • next:读取下一条记录;
  • 内容控制:
    • 读入文件:getline
    • 关闭文件:close,可以针对getline打开的文件;
    • 导出文件: printf("hello word!\n")>>"datafile"
    • 导出到其它命令:printf("hello word!\n")|"sort -t‘,‘"
    • 读入其它命令结果:who -u | awk ‘{printf("%s 正在执行%s\n",$2,$1)}‘
    • 在 awk 中执行 shell 命令行:嵌入函数 system(),该函数将传给它的参数视作命令执行:END {close("myreport.txt");system("lp myreport.txt");}
  •  示例:
    • 显示文本第7~15行:awk -F % ‘NR==7,NR==15 {printf $1 $3 $7}‘

  • 技巧or注意:
    • 1 如果要让 awk所使用变量的明确类型,应当在在程序中给它赋初值;awk不知道时默认字符串类型;
    • 2 如果读入某列是数值且做数值处理时,如果某行该列不是合法数字,则awk将其视为0处理;
    • 3 for ( x in myarray )打印数组时,并不依照顺序,可能是乱序输出;
    • 4 if (1 in fooarray),数组是否包含该值????好像不起效果啊

awk笔记

标签:

原文地址:http://blog.csdn.net/shuibaiz/article/details/43531279

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!