Chinaunix首页 | 论坛 | 博客
  • 博客访问: 310264
  • 博文数量: 81
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 847
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-25 22:29
个人简介

执一不失,能君万物http://weidian.com/s/284520723?wfr=c

文章分类

全部博文(81)

文章存档

2016年(11)

2015年(70)

我的朋友

分类: LINUX

2015-07-06 23:49:31


点击(此处)折叠或打开

  1. awk
  2. 1.简介
  3. awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。
  4. awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。
  5. awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言: AWK 程序设计语言, 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序,这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表,还有无数其他的功能。
  6. 2.使用方法
  7. awk '{pattern + action}' {filenames}
  8. pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。
  9. awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。
  10. 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。
  11. 3.调用awk
  12. 有三种方式调用awk
  13. ①.命令行方式
  14. awk [-F field-separator] 'commands' input-file(s)
  15. 其中,commands 是真正awk命令,[-F域分隔符]是可选的。 input-file(s) 是待处理的文件。
  16. 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。
  17. ②.shell脚本方式
  18. 将所有的awk命令插入一个文件,并使awk程序可执行,然后awk命令解释器作为脚本的首行,一遍通过键入脚本名称来调用。
  19. 相当于shell脚本首行的:#!/bin/sh
  20. 可以换成:#!/bin/awk
  21. ③.将所有的awk命令插入一个单独文件,然后调用:
  22. awk -f awk-script-file input-file(s)
  23. 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。
  24. 4.实例
  25. [root@localhost ~]# last -n 5
  26. root pts/0 192.168.1.44 Mon Jul 6 19:27 still logged in
  27. reboot system boot 2.6.32-279.el6.x Mon Jul 6 19:26 - 19:58 (00:32)
  28. reboot system boot 2.6.32-279.el6.x Mon Jul 6 19:21 - 19:58 (00:36)
  29. root pts/0 192.168.1.102 Mon Jul 6 17:55 - down (00:07)
  30. root tty1 :0 Mon Jul 6 17:54 - 17:55 (00:00)
  31. wtmp begins Thu May 28 23:55:44 2015
  32. [root@localhost ~]#
  33. [root@localhost ~]# last -n 5 |awk '{print $1}'
  34. root
  35. reboot
  36. reboot
  37. root
  38. root
  39. wtmp
  40. [root@localhost ~]#
  41. awk工作流程是这样的:读入有'\n'换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。默认域分隔符是"空白键"或"[tab]键",所以$1表示登录用户,$3表示登录用户ip,以此类推。
  42. [root@localhost ~]# cat testfile
  43. northwest NW Charles Main 3.0 .98 3 34
  44. western WE Sharon Gray 5.3 .97 5 23
  45. southwest SW Lewis Dalsass 2.7 .8 2 18
  46. southern SO Suan Chin 5.1 .95 4 15
  47. southeast SE Patricia Hemenway 4.0 .7 4 17
  48. eastern EA TB Savage 4.4 .84 5 20
  49. northeast NE AM Main Jr. 5.1 .94 3 13
  50. north NO Margot Weber 4.5 .89 5 9
  51. central CT Ann Stephens 5.7 .94 5 13
  52. [root@localhost ~]# cat testfile | awk '{print $1}'
  53. northwest
  54. western
  55. southwest
  56. southern
  57. southeast
  58. eastern
  59. northeast
  60. north
  61. central
  62. [root@localhost ~]#
  63. 这种是awk+action的示例,每行都会执行action{print $1}。
  64. [root@localhost ~]# cat testfile | awk '{print $1"\t"$3}'
  65. northwest Charles
  66. western Sharon
  67. southwest Lewis
  68. southern Suan
  69. southeast Patricia
  70. eastern TB
  71. northeast AM
  72. north Margot
  73. central Ann
  74. [root@localhost ~]#
  75. [root@localhost ~]# tail -n 5 /etc/passwd
  76. webalizer:x:67:67:Webalizer:/var/www/usage:/sbin/nologin
  77. sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
  78. memcached:x:496:492:Memcached daemon:/var/run/memcached:/sbin/nologin
  79. squid:x:23:23::/var/spool/squid:/sbin/nologin
  80. tcpdump:x:72:72::/:/sbin/nologin
  81. [root@localhost ~]# tail -n 5 /etc/passwd|awk -F ':' 'BEGIN {print "name,shell"} {print $1","$7} END {print "TroubleShooting,/bin/bash"}'
  82. name,shell
  83. webalizer,/sbin/nologin
  84. sshd,/sbin/nologin
  85. memcached,/sbin/nologin
  86. squid,/sbin/nologin
  87. tcpdump,/sbin/nologin
  88. TroubleShooting,/bin/bash
  89. [root@localhost ~]#
  90. awk工作流程是这样的:先执行BEGIN,然后读取文件,读入有\n换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域,随后开始执行模式所对应的动作action。接着开始读入第二条记录······直到所有的记录都读完,最后执行END操作。
  91. ===>
  92. [root@localhost ~]# tail -n 5 /etc/passwd|awk -F: 'BEGIN {print "name,shell"} {print $1","$7} END {print "TroubleShooting,/bin/bash"}'
  93. [root@localhost ~]# awk '/^south/' testfile
  94. southwest SW Lewis Dalsass 2.7 .8 2 18
  95. southern SO Suan Chin 5.1 .95 4 15
  96. southeast SE Patricia Hemenway 4.0 .7 4 17
  97. [root@localhost ~]# awk '/^south/{print "Hello World!"}' testfile
  98. Hello World!
  99. Hello World!
  100. Hello World!
  101. [root@localhost ~]#
  102. 这种是pattern的使用示例,匹配了pattern(这里是root)的行才会执行action(没有指定action,默认输出每行的内容)。
  103. 5.AWK内置变量
  104. awk有许多内置变量用来设置环境信息,这些变量可以被改变,下面给出了最常用的一些变量。
  105. ARGC 命令行参数个数ARGuments, argument counter
  106. ARGV 命令行参数排列ARGuments, argument vector
  107. ENVIRON 支持队列中系统环境变量的使用
  108. FILENAME awk浏览的文件名
  109. FNR 浏览文件的记录数
  110. FS 设置输入域分隔符,等价于命令行 -F选项
  111. NF 浏览记录的域的个数
  112. NR 已读的记录数
  113. OFS 输出域分隔符
  114. ORS 输出记录分隔符
  115. RS 控制记录分隔符
  116. 此外,$0变量是指整条记录。$1表示当前行的第一个域,$2表示当前行的第二个域,......以此类推
  117. 统计/etc/passwd:文件名,每行的行号,每行的列数,对应的完整行内容:
  118. [root@localhost ~]# awk -F: '{print "File name:"FILENAME",LineNumber:"NR",Columns:"NF",LineContents:"$0}' /etc/passwd
  119. File name:/etc/passwd,LineNumber:1,Columns:7,LineContents:root:x:0:0:root:/root:/bin/bash
  120. File name:/etc/passwd,LineNumber:2,Columns:7,LineContents:bin:x:1:1:bin:/bin:/sbin/nologin
  121. File name:/etc/passwd,LineNumber:3,Columns:7,LineContents:daemon:x:2:2:daemon:/sbin:/sbin/nologin
  122. File name:/etc/passwd,LineNumber:4,Columns:7,LineContents:adm:x:3:4:adm:/var/adm:/sbin/nologin
  123. File name:/etc/passwd,LineNumber:5,Columns:7,LineContents:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  124. File name:/etc/passwd,LineNumber:6,Columns:7,LineContents:sync:x:5:0:sync:/sbin:/bin/sync
  125. File name:/etc/passwd,LineNumber:7,Columns:7,LineContents:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  126. 使用printf替代print,可以让代码更加简洁,易读
  127. [root@localhost ~]# awk -F: '{printf("filename:%s,linenumber:%d,columns:%d,linecontent:%s\n",FILENAME,NR,NF,$0)}' /etc/passwd
  128. filename:/etc/passwd,linenumber:1,columns:7,linecontent:root:x:0:0:root:/root:/bin/bash
  129. filename:/etc/passwd,linenumber:2,columns:7,linecontent:bin:x:1:1:bin:/bin:/sbin/nologin
  130. filename:/etc/passwd,linenumber:3,columns:7,linecontent:daemon:x:2:2:daemon:/sbin:/sbin/nologin
  131. filename:/etc/passwd,linenumber:4,columns:7,linecontent:adm:x:3:4:adm:/var/adm:/sbin/nologin
  132. filename:/etc/passwd,linenumber:5,columns:7,linecontent:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  133. filename:/etc/passwd,linenumber:6,columns:7,linecontent:sync:x:5:0:sync:/sbin:/bin/sync
  134. filename:/etc/passwd,linenumber:7,columns:7,linecontent:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
  135. 6.awk编程
  136. 6.1变量和赋值
  137. [root@localhost ~]# awk 'BEGIN {count=0;print "[Start] user count is :",count} {count=count+1;print$0;} END {print "[end] user count is:",count}' /etc/passwd
  138. [Start] user count is : 0
  139. root:x:0:0:root:/root:/bin/bash
  140. bin:x:1:1:bin:/bin:/sbin/nologin
  141. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  142. adm:x:3:4:adm:/var/adm:/sbin/nologin
  143. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  144. 。。。。
  145. tcpdump:x:72:72::/:/sbin/nologin
  146. [end] user count is: 39
  147. [root@localhost ~]#
  148. count是自定义变量。之前的action{}里都是只有一个print,其实print只是一个语句,而action{}可以有多个语句,以;号隔开。
  149. 统计某个文件夹下的文件占用的字节数
  150. [root@localhost ~]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size}'
  151. [end]size is 102881
  152. [root@localhost ~]#
  153. 如果以M为单位显示:
  154. [root@localhost ~]# ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print "[end]size is ", size/1024/1024,"M"}'
  155. [end]size is 0.098115 M
  156. [root@localhost ~]#
  157. 6.2条件语句
  158. for
  159. 6.3循环语句
  160. do-while;
  161. 6.4数组

阅读(1195) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~