linux awk命令
一、awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。二. awk命令格式和选项2.1 awk的语法有两种形式1. 命令行方式 awk [-F field-separator] 'commands' input-file(s) 其中,commands是真正awk命令,[-F域分隔符]是可选的。input-file(s)是待处理的文件。 在awk中,文件的每一行中,由域分隔符分开的每一项称为一个域。通常,在不指名-F域分隔符的情况下,默认的域分隔符是空格。 2. 将所有的awk命令插入一个单独文件,然后调用: awk -f awk-script-file input-file(s) 其中,-f选项加载awk-script-file中的awk脚本,input-file(s)跟上面的是一样的。2.2 命令选项(1)-F fs or --field-separator fs :指定输入文件折分隔符,fs是一个字符串或者是一个正则表达式,如-F:。(2)-v var=value or --asign var=value :赋值一个用户定义变量。(3)-f scripfile or --file scriptfile :从脚本文件中读取awk命令。(4)-mf nnn and -mr nnn :对nnn值设置内在限制,-mf选项限制分配给nnn的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。(5)-W compact or --compat, -W traditional or --traditional :在兼容模式下运行awk。所以gawk的行为和标准的awk完全一样,所有的awk扩展都被忽略。(6)-W copyleft or --copyleft, -W copyright or --copyright :打印简短的版权信息。(7)-W help or --help, -W usage or --usage :打印全部awk选项和每个选项的简短说明。(8)-W lint or --lint :打印不能向传统unix平台移植的结构的警告。(9)-W lint-old or --lint-old :打印关于不能向传统unix平台移植的结构的警告。(10)-W posix :打开兼容模式。但有以下限制,不识别:/x、函数关键字、func、换码序列以及当fs是一个空格时,将新行作为一个域分隔符;操作符**和**=不能代替^和^=;fflush无效。(11)-W re-interval or --re-inerval :允许间隔正则表达式的使用,参考(grep中的Posix字符类),如括号表达式[[:alpha:]]。(12)-W source program-text or --source program-text :使用program-text作为源代码,可与-f命令混用。(13)-W version or --version :打印bug报告信息的版本。三. 使用方法#awk '{pattern + action}' {filenames}尽管操作可能会很复杂,但语法总是这样,其中 pattern 表示 AWK 在数据中查找的内容,而 action 是在找到匹配内容时所执行的一系列命令。花括号({})不需要在程序中始终出现,但它们用于根据特定的模式对一系列指令进行分组。 pattern就是要表示的正则表达式,用斜杠括起来。awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。 通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。四. 模式和操作awk脚本是由模式和操作组成的: pattern {action} 如$ awk '/root/' test,或$ awk '$3 %1选择第二个字段比第一个字段长的行。(4)模式匹配表达式:用运算符~(匹配)和~!(不匹配)。(5)模式,模式:指定一个行的范围。该语法不能包括BEGIN和END模式。(6)BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。(7)END:让用户在最后一条输入记录被读取之后发生的动作。4.2. 操作 操作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份:(1)变量或数组赋值(2)输出命令(3)内置函数(4)控制流命令五. awk的环境变量六. awk运算符七. 记录和域7.1. 记录 awk把每一个以换行符结束的行称为一个记录。 记录分隔符:默认的输入和输出的分隔符都是回车,保存在内建变量ORS和RS中。 $0变量:它指的是整条记录。如$ awk '{print $0}' test将输出test文件中的所有记录。 变量NR:一个计数器,每处理完一条记录,NR的值就增加1。 如$ awk '{print NR,$0}' test将输出test文件中所有记录,并在记录前显示记录号。7.2. 域记录中每个单词称做“域”,默认情况下以空格或tab分隔。awk可跟踪域的个数,并在内建变量NF中保存该值。如$ awk '{print $1,$3}' test将打印test文件中第一和第三个以空格分开的列(域)。7.3. 域分隔符 内建变量FS保存输入域分隔符的值,默认是空格或tab。我们可以通过-F命令行选项修改FS的值。如$ awk -F: '{print $1,$5}' test将打印以冒号为分隔符的第一,第五列的内容。 可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$awk -F'[:/t]' '{print $1,$3}' test,表示以空格、冒号和tab作为分隔符。 输出域的分隔符默认是一个空格,保存在OFS中。如$ awk -F: '{print $1,$5}' test,$1和$5间的逗号就是OFS的值。八. 匹配操作符(~) 用来在记录或者域内匹配正则表达式。如$ awk '$1 ~/^root/' test将显示test文件第一列中以root开头的行。九. 比较表达式 conditional expression1 ? expression2: expression3, 例如: $ awk '{max = {$1 > $3} ? $1: $3: print max}' test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给max。 $ awk '$1 + $2 5 && $2 < 10' test,如果第一个域大于5,并且第二个域小于10,则打印这些行。十. 范围模板范围模板匹配从第一个模板的第一次出现到第二个模板的第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ awk '/root/,/mysql/' test将显示root第一次出现到mysql第一次出现之间的所有行。
Linux入门系列——awk命令详解
awk是一个强大的文本分析工具,与grep、sed相比,awk在对数据分析并生成报告时,显得有很大的优势。 awk有三个不同的版本:awk、nawk和gawk,在没有做特殊说时的时候默认的就是gawk,gawk是awk的GNU版本。 其中command是真正的awk命令,-F表示域的分隔符,是个可选项。Filename是等待处理的文件 将所有的awk命令写入到一个文件,并使用该文件有X权限,然后awk命令解释器作为脚本的首行,也就是说可以把脚本最开始的 #!/bin/bash 换成 #!/bin/awk 最后直接执行这个脚本文件就行了。 -f 指定要加载的awk脚本,是一个文件。Filename是等待处理的文件 awk的工作流程是这样的:读入一行后(最后面带有” ”的),就按-F指定的分隔符来将该行划分成N个区域,$0表示所有的区域,$1表示第一个域,$2表示第二个域,依此类推,$n表示第n个域。 总结:awk先执行BEGIN内的命令,然后再读入文件中的行,接着就是按照指定的分隔符将该行分成N个区域,然后再来执行模式所对应的动作action。然后,再来读入第二行。。再重复执行action,直到所有的行都处理完成。最后再执行END中的命令。 注意:' // '之间是支持正则表达式的,如果此处只有pattern,而没有action,那么awk默认会把匹配到的行打印出来。 awk中的print还可以使用C语言中的printf来替代。在输出格式比较复杂的时候使用printf函数会比print函数要更直观一些,如下: 还可以使用-v key=value来自定义变量。如下: awk中的条件语句是从C中借鉴过来的 语法:if (condition) {then-body} else {else-body} 例如使用awk来统计某个目录下的普通文件的大小,不包括子目录的,并过滤掉目录。 循环语句也和C中的一样,支持while、do/while、for、continue、break等关键字。 break和continue常用于循环中; 在awk中,数组的下标可以是数字或字母。一般awk中的数组的作用是从记录中收集信息,用于计算总和、统计单词等。 在awk中要删除一个元素的时候使用 delete array[index] 更多请参见awk官方文档[http://www.gnu.org/software/gawk/manual/gawk.html]