Successfully reported this slideshow.

Awk skills

10

Share

Loading in …3
×
1 of 13
1 of 13

More Related Content

Related Books

Free with a 14 day trial from Scribd

See all

Awk skills

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

×