Loading... <p style="text-indent: 2em"><strong>前言</strong></p> <p style="text-indent: 2em">awk是一款强大的报告生成器,不同于sed和grep,它的侧重点是如何把文本信息更好的展示出来,常用与统计和格式化输出。awk相当于微型的shell,有着自己一套语法结构,例如:循环结构,数组,条件判断,函数,内置变量等功能。处理对象一般纯文本文件或纯文本信息。</p> <p style="text-indent: 2em"><strong>用法详解</strong></p> <p style="text-indent: 2em"><strong>基本语法</strong><br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">awk [options] 'program' file file ... awk [options] 'PATTERN{action}' file file ... -F CHAR:输入分隔符</pre> <p style="text-indent: 2em"><strong>awk的输出</strong></p> <pre class="brush:bash;toolbar:false">print item1, item2,...</pre> </p> <p style="text-indent: 2em">① 各项目之间使用逗号分隔,而输出时则使用输出分隔符分隔</p> <p style="text-indent: 2em">② 输出的各item可以字符串或数值、当前记录的字段、变量或awk的表达式,数值会被隐式转换为字符串后输出</p> <p style="text-indent: 2em">③ print后面item如果省略,相当于print $0,若输出空白,使用pirnt ""</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180321-53.jpg" title="1430273324106816.jpg" alt="1.jpg" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-82.jpg" title="1430273362138073.jpg" alt="2.jpg" /></p> <p style="text-indent: 2em"><strong>模式</strong></p> </p> <p style="text-indent: 2em">① Regexp: 格式为/PATTERN/,仅处理被/PATTERN/匹配到的行</p> <p style="text-indent: 2em">② Expression: 表达式,其结果为非0或非空字符串时满足条件,仅处理满足条件的行</p> <p style="text-indent: 2em">③ Ranges: 行范围,此前地址定界,startline, endline,仅处理范围内的行</p> <p style="text-indent: 2em">④ BEGIN/END: 特殊模式,仅在awk命令的program运行之前(BEGIN)或运行之后(END)执行一次</p> <p style="text-indent: 2em">⑤ Empty:空模式,匹配任意行</p> <p style="text-indent: 2em"><strong>awk的变量</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">内置变量<strong><br style="text-indent: 2em" /></strong></p> <pre class="brush:bash;toolbar:false">FS:Field Seperator, 输入时的字段分隔符 RS:Record Seperator, 输出行分隔符 OFS: Output Field Seperator, 输出时的字段分隔符; ORS: Outpput Row Seperator, 输出时的行分隔符;</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-8.jpg" title="1430273385930240.jpg" alt="3.jpg" /></p> <pre class="brush:bash;toolbar:false">NR:Numbers of Record, 行数;所有文件的一并计数</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-51.jpg" title="1430273423859307.jpg" alt="4.jpg" /></p> <pre class="brush:bash;toolbar:false">NF:Numbers of Field,字段数</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-25.jpg" title="1430273445136671.jpg" alt="5.jpg" /></p> <pre class="brush:bash;toolbar:false">FNR:行数;各文件分别计数;</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-90.jpg" title="1430273465283026.jpg" alt="6.jpg" /></p> <pre class="brush:bash;toolbar:false">ARGV:数组,保存命令本身这个字符,awk '{print $0}' 1.txt 2.txt,意味着ARGV[0]保存awk ARGC: 保存awk命令中参数的个数 FILENAME: awk正在处理的当前文件的名称</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-4.jpg" title="1430273481114849.jpg" alt="7.jpg" /></p> <p style="text-indent: 2em">可自定义变量</p> <pre class="brush:bash;toolbar:false">-v var_name=VALUE #变量名区分字符大小写</pre> </p> <p style="text-indent: 2em">①可以program中定义变量</p> <p style="text-indent: 2em">② 可以命令行中通过-v选项自定义变量</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-18.jpg" title="1430273595791965.jpg" alt="9.jpg" /></p> <p style="text-indent: 2em"><strong>awk的printf命令</strong></p> <pre class="brush:bash;toolbar:false">命令使用格式:printf format, item1, item2,...</pre> </p> <p style="text-indent: 2em">① 要指定format</p> <p style="text-indent: 2em">②不会自动换行;如需换行则需要给出\n</p> <p style="text-indent: 2em">③format用于为后面的每个item指定其输出格式</p> <pre class="brush:bash;toolbar:false">format格式的指示符都%开头,后跟一个字符: %c: 显示字符的ASCII码; %d, %i: 十进制整数; %e, %E: 科学计数法显示数值; %f: 显示浮点数; %g, %G: 以科学计数法格式或浮点数格式显示数值; %s: 显示字符串; %u: 显示无符号整数; %%: 显示%自身; 修饰符: #:显示宽度 -:左对齐 +:显示数值的符号 .#: 取值精度</pre> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-87.jpg" title="1430273613694831.jpg" alt="10.jpg" /></p> <p style="text-indent: 2em"><strong>awk输出重定向</strong><br style="text-indent: 2em" /></p> <pre class="brush:bash;toolbar:false">print items > output-file #保存到某文件 print items >> output-file #追加到某文件 print items | command #使用管道交给某些命令处理 特殊文件描述符: /dev/stdin: 标准输入 /dev/stdout: 标准输出 /dev/stderr: 错误输出</pre> <p style="text-indent: 2em"><strong><img src="//cto.wang/usr/uploads/2016/07/20160703180322-46.jpg" title="1430273629116737.jpg" alt="11.jpg" /></strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>awk的操作符</strong></p> <pre class="brush:bash;toolbar:false">算术操作符: x+y x-y x*y x/y x**y, x^y x%y -x:负值 +x:转换为数值 字符串操作符:连接 赋值操作符: = += -= *= /= %= ^= **= ++ -- 如果模式自身是=号,要写为/=/ 比较操作符: < <= > >= == != ~:模式匹配,左边的字符串能够被右边的模式所匹配为真,否则为假; !~:不匹配为真,匹配为假 逻辑操作符: &&: 与 ||:或 条件表达式: selector?if-true-expression:if-false-expression 函数调用: function_name(argu1,argu2)</pre> <p style="text-indent: 2em">例:判断UID是否大于等于500,如果为真就显示为普通用户,如果为假就显示为系统或管理用户</p> <p style="text-indent: 2em"><strong><img src="//cto.wang/usr/uploads/2016/07/20160703180322-68.jpg" title="1430273649743554.jpg" alt="12.jpg" /></strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><strong>常用的action</strong></p> </p> <p style="text-indent: 2em">①Expressions:表达式 赋值等</p> <p style="text-indent: 2em">② Control statements:条件语句,控制语句if while…</p> <p style="text-indent: 2em">③Compound statements:组合语句</p> <p style="text-indent: 2em">④ input statements:输入语句</p> <p style="text-indent: 2em">⑤ output statements:输出语句</p> <p style="text-indent: 2em"><strong>控制语句</strong><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">if-else<strong><br style="text-indent: 2em" /></strong></p> <pre class="brush:bash;toolbar:false">格式:if (condition) {then body} else {else body}</pre> <p style="text-indent: 2em">例:uid>=500的用户显示为普通用户,否则显示为管理用户</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-79.jpg" title="1430273671327372.jpg" alt="13.jpg" /></p> <p style="text-indent: 2em">例:显示文件中字段数大于等于8的行</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-53.jpg" title="1430273690138967.jpg" alt="14.jpg" /></p> <p style="text-indent: 2em">while</p> <pre class="brush:bash;toolbar:false">格式:while (condition) {while body}</pre> <p style="text-indent: 2em">例:只显示奇数行<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-73.jpg" title="1430273710523633.jpg" alt="15.jpg" /></p> <p style="text-indent: 2em">例:只输出每行大于6的字段<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-89.jpg" title="1430273726173953.jpg" alt="16.jpg" /></p> <p style="text-indent: 2em">do-while循环</p> <pre class="brush:bash;toolbar:false">格式:do {do-while body} while (condition)</pre> <p style="text-indent: 2em">例:输出1到100之和<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-70.jpg" title="1430273741261563.jpg" alt="17.jpg" /></p> <p style="text-indent: 2em">for循环</p> <pre class="brush:bash;toolbar:false">格式:for (variable assignment; condition; iteration process) {for body}</pre> <p style="text-indent: 2em">例:显示奇数行<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-23.jpg" title="1430273758817323.jpg" alt="18.jpg" /></p> <p style="text-indent: 2em">例:输出每行大于6的字段</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-97.jpg" title="1430273774119414.jpg" alt="19.jpg" /></p> </p> <p style="text-indent: 2em">for循环可用来遍历数组元素</p> <pre class="brush:bash;toolbar:false">语法:for (i in array) {for body}</pre> <p style="text-indent: 2em">例:A中保存数组,B中保存数组下标</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-31.jpg" title="1430273791360888.jpg" alt="20.jpg" /><br style="text-indent: 2em" /></p> <p style="text-indent: 2em">case语句</p> <pre class="brush:bash;toolbar:false">语法:switch (expression) {case VALUE or /RGEEXP/: statement1;... default: stementN}</pre> <p style="text-indent: 2em"> 循环控制</p> <pre class="brush:bash;toolbar:false">break #退出当前循环 continue #提前结束本轮循环,直接进入下轮循环</pre> <p style="text-indent: 2em">next</p> <p style="text-indent: 2em">提前结束对本行的处理进而进入下一行的处理</p> <p style="text-indent: 2em">例:显示用户id为奇数的用户</p> <p style="text-indent: 2em"><img src="//cto.wang/usr/uploads/2016/07/20160703180322-92.jpg" title="1430273807987758.jpg" alt="21.jpg" /></p> <p style="text-indent: 2em">例:输出奇数行的用户<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="/upload/vbg2n02qadu.jpg" title="1430273825820643.jpg" alt="22.jpg" /></p> <p style="text-indent: 2em"><strong>数组</strong></p> <p style="text-indent: 2em">关联数组<strong><br style="text-indent: 2em" /></strong></p> <pre class="brush:bash;toolbar:false">array[index-expression] index-expression: 可以使用任意字符串; 如果某数组元素事先不存在,那么在引用时,awk会自动创 建此元素并将其初始化为空串;因此,要判断某数组是否存在某元素,必须使用“index in array” 这种格式</pre> <p style="text-indent: 2em">要遍历数组中的每一个元素,需要使用如下特殊结构</p> <pre class="brush:bash;toolbar:false">for (var in array) {for body} #其var会遍历array的索引</pre> <p style="text-indent: 2em">例:统计每一种网络连接出现的次数</p> <p style="text-indent: 2em"><img src="/upload/cenmtdkx2cv.jpg" title="1430273849343925.jpg" alt="23.jpg" /></p> <p style="text-indent: 2em">例:统计web服务访问日志中的ip访问量<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="/upload/bavhtoyttbd.jpg" title="1430273863123790.jpg" alt="24.jpg" /></p> <p style="text-indent: 2em">删除数组元素</p> <p style="text-indent: 2em">关系数组中删除数组索引需要使用delete命令</p> <pre class="brush:bash;toolbar:false">格式:delete array[index]</pre> <p style="text-indent: 2em"><strong>awk的内置函数</strong></p> <pre class="brush:bash;toolbar:false">split(string,array[,fieldsep[,seps]]) 功能:将string表示的字符串以fieldsep为分隔符进行切片,并切片后的结果保存至array为名的数组中;数组下标从1开始 此函数有返回值,返回值为切片后的元素的个数</pre> <p style="text-indent: 2em">例:统计连接请求的ip<br style="text-indent: 2em" /></p> <p style="text-indent: 2em"><img src="/upload/n3nbejch21b.jpg" title="1430273882215745.jpg" alt="25.jpg" /></p> <pre class="brush:bash;toolbar:false">length(string) 功能:返回给定字串的长度 substr(string,start[,length]) 功能:从string中取子串,从start为起始位置为取length长度的子串 system(command) 功能:执行系统command并将结果返回至awk命令 systime() 功能:systime函数返回从1970年1月1日开始到当前时间(不计闰年)的整秒数 tolower(s) 功能:将s中的所有字母转为小写 toupper(s) 功能:将s中的所有字母转为大写</pre> <p style="text-indent: 2em"><strong>The end</strong></p> <p style="text-indent: 2em">好了,awk的用法就先说到这里了,awk不仅强大,而且看的我头大,有兴趣的可以深入研究,此篇就不继续深入了。以上仅为个人学习整理,如有错漏,大神勿喷~~~</p> <p></p> 最后修改:2021 年 12 月 10 日 10 : 53 AM © 允许规范转载 赞赏 如果觉得我的文章对你有用,请随意赞赏 赞赏作者 支付宝微信