Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Awk skills

14,621 views

Published on

by bones7456 @ HZLUG

Published in: Technology
  • I agree with the upstair guy.
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Awk skills

  1. 1. Awk skills By @ bones7456 2011.1
  2. 2. 简介 awk是*nix系统的最基本的命令之一 我的路由器里都有包含 awk是一种 程序语言 因为有变量、函数、循环、分支等等 不需编译,无类型,支持数组 代码风格和C类似 方便的内建功能和内建变量 $0, $1, ..., NF, NR, ... 有 mawk 、 gawk 等不同实现版本,但大同小异 gawk 有一些额外的函数
  3. 3. Hello world? awk 最初的用法,估计是取文本流里的某些列 echo -e "a 1 2nb 3 4na 5 6" | awk '{print $2,$3}' 接下来,是取特定行的某些列 awk '$1 == "a"{print $2,$3}'
  4. 4. awk的执行过程 Pattern { Actions } 结构 整个awk程序,就是由若干个 Pattern { Actions } 组成 结论:依次读入文本流的一行,更新内建变量的值,对这行依次执行每个Pattern { Actions }
  5. 5. Pattern可以是... 空 (始终满足) 任何条件表达式 >, <, >=, <=, ==, !=, ~, !~ 上面的组合 特殊值 BEGIN END
  6. 6. Actions可以是... I/O 指令 print, printf, getline 计算表达式 赋值、调用函数 循环、分支 while、if、...
  7. 7. I/O之I 从外部读入数据,是awk的默认行为 读入数据的时候,用内建变量 FS 来把整行分割成列。 FS 可以通过命令行参数-F指定,也可以直接赋值。 整行数据放在 $0 ,第一列放在 $1 ,第二列 $2 ... 总列数放在 NF ,读入的行数放在 NR 、 FNR 可以使用 $NF 、 $(NF-1)
  8. 8. I/O之I 唯一的输入函数getline 读文件 awk 'BEGIN{while(getline < "/etc/issue")print $0}' 读管道 awk 'BEGIN{"date" | getline a; print a}' 注意:命令最好要主动close掉,不然会引起不可知的问题 awk 'BEGIN{cmd="date";cmd | getline a;close(cmd); print a}' close的内容要命令严格一致,所以建议使用变量。
  9. 9. I/O之O print 依次输出指定的各项 各项之间用 OFS 分隔,默认是一个空格 最后面加上一个 ORS ,默认是一个回车 printf 类似C语言的printf 用格式字符串指定输出方式,不添加任何额外的字符 C的printf可以看 man 3 printf
  10. 10. 数组 一个有实际功能的程序:word counter awk -F"[ t,.]+" '{for(i=1;i<=NF;i++)A[$i]++} END{for(key in A)print key,A[key]}' | sort -nrk2 | head | column -t awk中的数组是离散的,下标可以是任意类型,多维数组也一维处理。 awk 'BEGIN{A[1,2]=3;A[1,2]++;print A[1,2]}'
  11. 11. 从shell传入变量 传变量的功能很常用,要用-v参数 awk -v abc=1 'BEGIN{abc++;print abc}'
  12. 12. 杂项 处理多行数据? awk是用变量 RS 来分“行”的,默认是n 改变 RS ,就可以改变分行方式 RS ="",为空则用空白行分块 awk代码很巨大?本身包含单引号? 可以把代码写进文件,用 -f 引用 有哪些内建函数?忘了内建变量的具体含义? 可以man awk,或者打开 http://luy.li/data/awk.html
  13. 13. Thanks! any questions?

×