awk 详解

Posted on Posted in command
Tips: 本文创建于2016年5月3日,已超过 2 年,内容或图片可能已经失效!

## awk的工作流程

1. 读(Read)

AWK 从输入流(文件、管道或者标准输入)中读入一行然后将其存入内存中。

2. 执行(Execute)

对于每一行输入,所有的 AWK 命令按顺执行。 默认情况下,AWK 命令是针对于每一行输入,但是我们可以将
其限制在指定的模式中。

3. 重复(Repeate)

一直重复上述两个过程直到文件结束。

## 程序的结构

我们已经见过 AWK 程序的工作流程。 现在让我们一起来学习 AWK 程序的结构。

1. 开始块(BEGIN block)

开始块的语法格式如下所示:
BEGIN {awk-commands}
顾名思义,开始块就是在程序启动的时候执行的代码部分,并且它在整个过程中只执行一次。 一般情况下,我们在开始块中初始化一些变量。BEGIN 是 AWK的关键字,因此它必须是大写的。 不过,请注意,开始块部分是可选的,你的程序可以没有开始块部分。

2. 主体块(Body Block)

主体部分的语法要求如下:
/pattern/ {awk-commands}
对于每一个输入的行都会执行一次主体部分的命令。默认情况下,对于输入的每一行,AWK 都会很执行命令。但是,我们可以将其限定在指定的模式中。 注意,在主体块部分没有关键字存在。

3. 结束块(END Block)

下面是结束块的语法格式:
END {awk-commands}
结束块是在程序结束时执行的代码。 END 也是 AWK 的关键字,它也必须大写。 与开始块相似,结束块也是可
选的

> 示例

  1. -> c1 ~/tmp ? cat awk.txt   
  2. 1) Amit Physics 80  
  3. 2) Rahul Maths 90  
  4. 3) Shyam Biology 87  
  5. 4) Kedar English 85  
  6. 5) Hari History 89  
  7.   
  8. -> c1 ~/tmp ? awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"}{print}' awk.txt  
  9. Sr No   Name    Sub Marks  
  10. 1) Amit Physics 80  
  11. 2) Rahul Maths 90  
  12. 3) Shyam Biology 87  
  13. 4) Kedar English 85  
  14. 5) Hari History 89  

## awk基本语法

  1. # awk 调用文件  
  2. -> c1 ~/tmp ? awk -f command.awk awk.txt   
  3. 1) Amit Physics 80  
  4. 2) Rahul Maths 90  
  5. 3) Shyam Biology 87  
  6. 4) Kedar English 85  
  7. 5) Hari History 89  
  8. -> c1 ~/tmp ? cat command.awk {print}  

- -v : 可以为变量赋值。它允许在程序执行之前为变量赋值。

  1. -> c1 ~/tmp ? awk -v name=Jerry 'BEGIN{printf "Name = %s\n", name}'  
  2. Name = Jerry  

- --dump-variables[=file] : 此选项会将全局变量及相应值按序输出到指定文件中。默认的输出文件名是 awkvars.out

  1. -> c1 ~/tmp ? awk --dump-variables ''                                
  2. -> c1 ~/tmp ? vim awkvars.out   
  3. ARGC: number (1)                                                                                                                                            
  4. ARGIND: number (0)               
  5. ARGV: array, 1 elements          
  6. BINMODE: number (0)  
  7. CONVFMT: string ("%.6g")         
  8. ERRNO: number (0)                
  9. FIELDWIDTHS: string ("")         
  10. FILENAME: string ("")            
  11. FNR: number (0)  
  12. FS: string (" ")  
  13. IGNORECASE: number (0)  
  14. LINT: number (0)  
  15. NF: number (0)  
  16. NR: number (0)  
  17. OFMT: string ("%.6g")  
  18. OFS: string (" ")  
  19. ORS: string ("\n")  
  20. RLENGTH: number (0)  
  21. RS: string ("\n")  
  22. RSTART: number (0)  
  23. RT: string ("")  
  24. SUBSEP: string ("\034")  
  25. TEXTDOMAIN: string ("messages")  
  26.   
  27. # 打印列  
  28. -> c1 ~/tmp ? awk '{print $3 "\t" $4}' awk.txt   
  29. Physics 80  
  30. Maths   90  
  31. Biology 87  
  32. English 85  
  33. History 89  
  34.                
  35. # 输出所有行  
  36. -> c1 ~/tmp ? awk '/a/ {print $0}' awk.txt  
  37. 2) Rahul Maths 90  
  38. 3) Shyam Biology 87  
  39. 4) Kedar English 85  
  40. 5) Hari History 89  
  41.   
  42. #上面的示例中,我们搜索模式串 a,每次成功匹配后都会执行主体块中的命令。如果没有主体块——默认的动作  
  43. 是输出记录(行)。因此上面的效果也可以使用下面简略方式实现,它们会得到相同的结果:  
  44.   
  45. -> c1 ~/tmp ? awk '/a/' awk.txt   
  46. 2) Rahul Maths 90  
  47. 3) Shyam Biology 87  
  48. 4) Kedar English 85  
  49. 5) Hari History 89  
  50.   
  51. # 通过匹配模式串输出列  
  52. -> c1 ~/tmp ? awk '/a/ {print $3 "\t" $4}' awk.txt   
  53. Maths   90  
  54. Biology 87  
  55. English 85  
  56. History 89  
  57.   
  58. #计数匹配次数并输出  
  59. -> c1 ~/tmp ? awk '/a/{++cnt}END{print "Count=",cnt}' awk.txt   
  60. Count= 4  
  61.   
  62. # 输出字符数多于 18 的行  
  63. -> c1 ~/tmp ? awk 'length($0)>18' awk.txt   
  64. 3) Shyam Biology 87  
  65. 4) Kedar English 85  

## 内置变量

* NF : 表示当前输入记录中域的数量(列)

  1. -> c1 ~/tmp ? echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NF > 2'  
  2. One Two Three  
  3. One Two Three Four  

* NR : 此变量表示当前记录的数量(行)

  1. -> c1 ~/tmp ?  echo -e "One Two\nOne Two Three\nOne Two Three Four" | awk 'NR < 3'  
  2. One Two  
  3. One Two Three  

## 两个附件

[AWK程序设计语言][2]
[AWK 教程 - v1.0.pdf][1]

[1]: http://liuhonghe.me/wp-content/uploads/2016/05/820038599.pdf
[2]: http://awk.readthedocs.io/en/latest/chapter-one.html

» 转载请注明来源:若我若鱼 » awk 详解

Leave a Reply

Your email address will not be published. Required fields are marked *

16 − 12 =