登录手机网站模板html,广州商城网站开发,做食品团购去那家网站好,seo课程培训学校awk是一个强大的文本分析工具#xff0c;相对于grep的查找#xff0c;sed的编辑#xff0c;awk在其对数据分析并生成报告时#xff0c;显得尤为强大。简单来说awk就是把文件逐行的读入#xff0c;以空格为默认分隔符将每行切片#xff0c;切开的部分再进行各种分析处理。…awk是一个强大的文本分析工具相对于grep的查找sed的编辑awk在其对数据分析并生成报告时显得尤为强大。简单来说awk就是把文件逐行的读入以空格为默认分隔符将每行切片切开的部分再进行各种分析处理。
awk有3个不同版本: awk、nawk和gawk未作特别说明一般指gawkgawk 是 AWK 的 GNU 版本。
awk其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母。实际上 AWK 的确拥有自己的语言 AWK 程序设计语言 三位创建者已将它正式定义为“样式扫描和处理语言”。它允许您创建简短的程序这些程序读取输入文件、为数据排序、处理数据、对输入执行计算以及生成报表还有无数其他的功能
代码块 awk的所有代码(目前这么认为)都是写在语句块中的。 语句块可分为3类 BEGIN语句块、END语句块和main语句块。 其中BEGIN语句块和END语句块都是的格式分别为BEGIN{...}和END{...}而main语句块是一种统称它的pattern部分没有固定格式也可以省略main代码块是在读取文件的每一行的时候都执行的代码块。 BEGIN代码块 在读取文件之前执行且执行一次 在BEGIN代码块中无法使用$0或其它一些特殊变量 main代码块 读取文件时循环执行(默认情况)每读取一行就执行一次main代码块 main代码块可有多个 END代码块 在读取文件完成之后执行且执行一次 有END代码块必有要读取的数据(可以是标准输入) END代码块中可以使用$0等一些特殊变量只不过这些特殊变量保存的是最后一轮awk循环的数据 语法 awk [options] pattern{action} file1 fiel1 awk的语法 多个pattern{action}可以直接连接连用 action中多个语句如果写在同一行则需使用分号分隔 pattern部分用于筛选行action表示在筛选通过后执行的操作 pattern和action都可以省略 省略pattern等价于对每一行数据都执行action 例如awk {print $0} a.txt 省略代码块{action}等价于{print}即输出所有行 例如awk /Alice/ a.txt等价于awk /Alice/{print $0} a.txt 省略代码块中的action表示对筛选的行什么都不做 例如awk /Alice/{} a.txt pattern{action}任何一部分都可以省略 例如:awk a.txt pattern{action}语句结构(都称之为语句块)其中的pattern部分可以使用下面列出的模式 # 特殊pattern BEGIN END # 布尔代码块 /regular expression/ # 正则匹配成功与否 /a.*ef/{action} relational expression # 即等值比较、大小比较 32{action} pattern pattern # 逻辑与 32 31 {action} pattern || pattern # 逻辑或 32 || 31 {action} ! pattern # 逻辑取反 !/a.*ef/{action} (pattern) # 改变优先级 pattern ? pattern : pattern # 三目运算符决定的布尔值 # 范围pattern非布尔代码块 pattern1, pattern2 # 范围pat1打开、pat2关闭即flip,flop模式 工作原理 # awk-F: {print $1,$3} /etc/passwd (1)awk使用一行作为输入并将这一行赋给内部变量$0,每一行也可称为一一个记录以换行符结束 (2)然后行被: (默认为空格或制表符)分解成字段(或域)每个字段存储在已编号的变量中从$1开始最多达100个字段 (3)awk如何知道用空格来分隔字段的呢?因为有一个内部变量FS来确定字段分隔符。初始时FS赋为空格 (4)awk打印字段时将以设置的方法使用print西数打印awk在打印的字段间加上空格因为$1,$3之间有一个逗号。逗号比较特殊它映射为另一个内部变量称为输出字段分隔符OFS, OFS默认为空格 (5)awk输出之后将从文件中获取另行并将其存储在$0中覆盖原来的内容然后将新的字符串分隔成字段并进行处理。该过程将持续到所有行处理完毕 变量RS 可设置表示输入记录分隔符的预定义(Record Separator)来改变每次读取的记录模式。 RS通常设置在BEGIN代码块中因为要先于读取文件就确定好RS分隔符。 RS指定输入记录分隔符时所读取的记录中是不包含分隔符字符的。例如RSa则$0中一定不可能出现字符a 特殊的RS值用来解决特殊读取需求 RS按段落读取 RS\0一次性读取所有数据但有些特殊文件中包含了空字符\0 RS^$真正的一次性读取所有数据因为非空文件不可能匹配成功 RS\n按行读取但忽略所有空行 RS两种可能情况 ·RS为单个字符直接使用该字符来分割记录 ·RS为多个字符将其当做正则表达式只要匹配正则表达式的符号都用来分割记录 。设置预定义变量IGNORECASE为非索正匹配时表示忽略大小写 。兼容模式下只有首字符才生效不会使用正则模式去分割记录 RT 在读取每条记录之后将其赋值给$0同时还会设置NR、FNR、RT。 在awk每次读完一条记录时会设置一个称为RT的预定义变量表示Record Termination。 当RS为单个字符时RT的值和RS的值是相同的。 当RS为多个字符(正则表达式)时则RT设置为正则匹配到记录分隔符之后真正用于划分记录时的字符。 当无法匹配到记录分隔符时RT设置为控制空字符串(即默认的初始值)。 NR 在读取每条记录之后将其赋值给$0同时还会设置NR、FNR、RT。 所有文件的行号计数器 FNR 在读取每条记录之后将其赋值给$0同时还会设置NR、FNR、RT。 是各个文件的行号计数器 字段分割 awk读取每一条记录之后会将其赋值给$0同时还会对这条记录按照预定义变量FS划分字段将划分好的各个字段分别赋值给$1 $2 $3 $4...$N同时将划分的字段数量赋值给预定义变量NF $N引用字段 N0即$0引用记录本身 0NNF引用对应字段 NNF表示引用不存在的字段返回空字符串 N0报错 方式 读取record之后将使用预定义变量FS、FIELDWIDTHS或FPAT中的一种来分割字段。分割完成之后再进入main代码段(所以在main中设置FS对本次已经读取的record是没有影响的但会影响下次读取)。 FS或-F FS或者-F字段分隔符 FS为单个字符时该字符即为字段分隔符 FS为多个字符时则采用正则表达式模式作为字段分隔符 特殊的也是FS默认的情况FS为单个空格时将以连续的空白空格、制表符、换行符作为字段分隔符 特殊的FS为空字符串””时将对每个字符都进行分隔即每个字符都作为一个字段 设置预定义变量IGNORECASE为非零值正则匹配时表示忽略大小写(只影响正则所以FS为单字时无影响) 如果record中无法找到FS指定的分隔符(例如将FS设置为”\n”)则整个记录作为一个字段即$1和$0相等。 FIELDWIDTHS 指定预定义变量FIELDWIDTHS按字符宽度分割字段这是gawk提供的高级功能。在处理某字段缺失时非常好用。 ·FIELDWIDTHS3569表示第一个字段3字符第二字段5字符.… ·FIELDWIDTHS8156233表示 。第一个字段读8个字符 。然后跳过1个字符再读5个字符作为第二个字段 。然后读6个字符作为第三个字段 。然后跳过2公字符在读33个字符作为第四个字段如果不足33个字符师读到结尾 ·FIELDWIDTHS23* 。第一个字段2个字符。第二个字段3个字符 。第三个字段剩余所有字符 。星号只能放在最后且只能单独使用表示剩余所有 FPAT FS是指定字段分隔符来取得除分隔符外的部分作为字段。 FPAT是取得匹配的字符部分作为字段。它是gawk提供的一个高级功能。 FPAT根据指定的正则来全局匹配record然后将所有匹配成功的部分组成$1、$2...不会修改$0。 awk BEGIN{FPAT[0-9]}{print $3-} a.txt 之后再设置FS或FPAT该变量将失效 OFS 分割表示使用FSfield Separator计算表示使用预定义变量OFSOutput Field Separator。 修改$0将使用FS重新分割字段所以会影响$1、$2... 修改$1、$2将根据$1到$NF等各字段来重新计算$0 即使是$1 $1这样的原值不变的修改也一样会重新计算$0 为不存在的字段赋值将新增字段并按需使用空字符串填充中间的字段并使用OFS重新计算$0 awk BEGIN{OFS-}{$(NF2)5;print $0} a.txt 增加NF值将使用空字符串新增字段并使用OFS重新计算$0 awk BEGIN{OFS-}{NF3;print $0} a.txt 减小NF值将丢弃一定数量的尾部字段并使用OFS重新计算$0 awk BEGIN{OFS-}{NF-3;print $0} a.txt 没有导致$0重建$0就一直是原原本本的数据所以指定OFS也无效。 当$0重建后将自动使用OFS重建所以即使没有指定OFS它也会采用默认值(空格)进行重建。 如果重建$0之后再去修改OFS将对当前行无效但对之后的行有效。所以如果也要对当前行生效需要再次重建。 有FS、FIELDWIDTHS、FPAT三种获取字段的方式可使用PROCINFO数组来确定本次使用何种方式获得字段。 PROCINFO是一个数组记录了awk进程工作时的状态信息。 如果 PROCINFO[FS]FS表示使用FS分割获取字段 PROCINFO[FPAT]FPAT表示使用FPAT匹配获取字段 PROCINFO[FIELDWIDTHS]FIELDWIDTHS表示使用FIELDWIDTHS分割获取字段
ARGV 数组保存命令行本身这个字符串如awk (print 50) a.txt这个命令中ARGV[0]保存awk ARGV[1]保存a.txt:
ARGC awk命令的参数的个数 FILENAME awk命令所处理的文件的名称
ENVIRON:当前环境变量及其值的关联数组
自定义变量test : awk -v testtest begin{print test} awk begin{ testtestprint test}
-----------格式化输出printf
format格式的指示符都以开头后跟一个字符:
%c:显示字符的ASCII码 %d, %i点十进制整数 %e,%E:科学计数法显示数值 %f:显示浮点数 %g,%G:以科学计数法的格式或浮点数的格式显示数值 %s:显示字符串 %u:无符号整数 %%显示%自身
修饰符 N:显示宽度 -: 左对齐 :显示数值符号
awk -F :{printf %-15s %i\n,$1,$3} /etc/passwd --------------内置函数
length 返回string字符 キ中字符的个数
awk -F ‘{i1,while(iNF){if(length)}}