awk(/??k/)是*nix下的一个强大的文本处理工具,名字取自三位作者AlfredAho、PeterJayWeinberger和BrianWilsonKernighan。awk提供的功能包括不限于正则匹配、流控制、算术运算,甚至包括函数等编程语言的一些特性。它于1977年发布,已有40多年的历史,被认为是老式软件。为了让人更直接的了解它的使用,我把它叫做命令行下的Excel。一些概念类似于Excel。TR;Drawk是一种高效的文本处理工具。awk脚本的基本结构是BEGIN->BODY->END。基本语法,awk脚本语法与C语言有很多相似之处。awk脚本编程实践和注意的地方。基本用法当我们在linux环境下有一些文本处理需求时,awk可以派上用场,比如nginx访问日志,文本信息去重等。awk可以直接在命令行执行,例如:echo""|awk'{print"helloworld!"}',也可以把一些逻辑复杂的代码写成awk脚本,然后指定脚本文件执行:awk-fa.awktest.txt程序结构awk的作用直接在命令行输入和执行awk脚本是一样的,所以下面的代码都写成一个脚本文件,方便阅读。一个完整的awk脚本分为三个部分:BEGIN{print("BEGIN");}打印(“身体”);}END{打印(“结束”);但是只有一个阶段就足够了。第一阶段是BEGIN,也就是扫描输入文本前的预处理时间。中间的BODY是扫描文本执行阶段。awk每扫描一行输入文本就会执行BODY中的脚本代码,最后是END,也就是文本扫描完成的阶段。在大多数使用场景下,我们可以直接在{}中编写代码,即省略BEGIN和END。awk理解输入前面说了,我把awk看成是*nix下的Excel,下面提到的一些概念和Excel还挺像的。一般来说,awk处理的文本都是一行一行的,比如nginx的日志文件。从awk的角度来看,一行文本被视为一条记录(Record),除以n。一行被空格分割成多个字段(Field),类似于Excel的行和列。所以awk程序中有两个全局变量NF,NR,很好理解。需要注意的是,字段的索引不是从0开始,而是从1开始。0是当前行的引用,通过$n的语法可以得到不同字段的值。{#当前记录有多少个字段print("NFis:"NF);#当前记录是什么print("NRis:"NR);#输出当前行的文本print($0);#输出当前行print($1)的第一个字段;}上面代码中,print是awk的一个内置函数,用于输出文本信息。注释可以在awk脚本中用#号书写。awk的语法与许多脚本程序的语法相同。awk没有严格的数据类型,不同的数据类型可以直接转换。awk中声明的所有变量都会成为全局变量,因此如果变量值在一个地方被修改,脚本中的其他地方也会受到影响。在流程控制方面,与主流编程语言几乎完全一致。if-else,while都支持,你可以在下面的例子中看到。传入参数也可以通过命令行的-v参数给awk脚本传入参数,如:echo''|awk-vname="jiavan"'{print("hello,"name);}'内置函数awk有很多内置函数用于字符串处理和数学运算,例如:index(str1,str2):返回str2在str1中出现的索引。length(str):返回字符串的长度。substr(str,n,m):截取字符串str的子串。match(str,reg):正则匹配,返回第一个匹配的索引。.....你可以man它的更多用途。内置变量awk还有一些内置变量名:$0当前处理的记录$1-$n当前记录的n个字段FS字段分隔符NF当前记录的字段数NR处理的记录数RS记录分隔符OFS输出字段separatorORS输出记录分隔符ARGC命令行参数个数ARGV命令行参数数组FILENAME当前输入文件名IGNRECASE记录为真忽略大小写匹配ARGINDARGV当前处理文件的标识符CONVFMT数字转换格式%.6gENVIRONUNIX环境变量ERRNOUNIX系统错误信息FIELDWIDTHS输入字段宽度的空格分隔的字符串FNR当前记录编号OFMT编号的输出格式%.6gRSTART匹配函数匹配的第一个字符串RLENGTH匹配函数匹配的字符串长度SUBSEP\034PROCINFO当前运行程序awk实践文本去重的进程信息数组有如下文件名.txt有重复文本。//name.txtjiavankellenlzyfakafangjiavanlzypig//a.awk{++names[$1];}END{for(keyinnames){print(key)>"./unique.txt";}}上面a.awk首先遍历了文件中的行,存储在一个数组中。在awk中,数组的键可以是任何数据类型,值也可以是任何数据类型。每次出现名称时,都会添加+1。最后可以统计每个名字出现的次数,将所有不重复的key输出到一个文件中,这里的操作类似于bash。搜索字符串对于输入文本words.txt,我们使用awk来查找带有av关键字的单词。//words.txt这是一个测试文件,其中包含一些关键字,例如average和avoid--由jiavan创建。//b.awk{while(match($0,/[a-zA-Z]+?av[a-zA-Z]+?/)){print(substr($0,RSTART,RLENGTH));$0=substr($0,RSTART+RLENGTH);}}//result$awk-fb.awkwords.txtaverageavoidavjiavan所以在TX中我的ID在游戏中显示为Ji**an:-)本文仅供拉屎的人阅读,不做参考。原文出处为https://github.com/Jiavan/jia...觉得对你有帮助就给个star吧
