一、awk介绍
    awk、sed&grep都可以匹配文本,但sed和awk可以对文本进行编辑,grep则不具有此功能;sed是非交互式的流编辑器,而awk则是一门模式匹配的编程语言。awk主要用于处理匹配的文本,同时awk还支持编程语言的一些特性,如变量、函数、循环语句等。
    二、基本用法
    1)awk [options] ‘program’ File1,File2…
    program:Pattern{Action Statements}
    program通常位于单引号中,多个action语句之间用逗号分隔。
    2)awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{action;… }’ file …
    常用action:print printf sub

    print后面可以连续写多个变量或字符串,比如
    CHANGED_TIME=$(svn info|grep "Last Changed Date"|awk '{print $4" "$5}')
    $4和$5同时被打印出来,中间还加了个空格” “。

    sub函数匹配指定域/记录中最大、最靠左边的子字符串的正则表达式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配的时候。格式如下:
    sub (regular expression, substitution string):
    sub (regular expression, substitution string, target string)
    举个例子
    NRECONFIG_VERSION=4.7.109.20.5
    NRECONFIG_MAJOR_VERSION=echo ${NRECONFIG_VERSION} | awk ‘{sub(/.$/,””)}1’``

    • //表示pattern是正则表达式
    • .匹配除换行符 \n 之外的任何单字符,$匹配输入字符串的结尾位置,.$就是匹配字符串的最后一个字符
    • 为了省空间,我通常使用 ‘1’来代替’{print}’去打印每行

    这条语句的作用就是将字符串NRECONFIG_VERSION的最后一个字符替换为空并打印出来赋值给NRECONFIG_MAJOR_VERSION。

    1. 常用options:<br /> -F:指明输入时用到的字段分隔符<br />`NRECONFIG_VERSION=4.7.109.20.5`<br />`NRECONFIG_MINOR_VERSION=`echo ${NRECONFIG_VERSION} | awk -F. '{print $5}'``<br /> 这条语句的作用是以.为分隔符将NRECONFIG_VERSION分段并打印第5个字段,然后赋值给NRECONFIG_MINOR_VERSION。<br />-v var=value:声明变量<br />引用shell变量,单引号+双引号+变量+双引号+单引号,'"$var"'<br />`echo ${NRECORE_VERSION} | awk '{sub(/'"$NRECORE_MINOR_VERSION"'$/,"")}1'`<br />三、awk的工作原理<br /> 1)在处理文本之前,若存在BEGIN语句块,则先执行此语句块中的语句。<br /> 2)将输入的文本或标准输入按回车(\n)分割,解析为多个记录(record,默认以\n分隔,记录的分割符可以同过awk的内置变量RS来更改)。<br /> 3)记录会被切割成多个字段(filed,默认情况下,以空白字符切割不同的字段,包括空格和制表符,字段的分隔符可以通过-F选项及awk内置变量FS来指定),并将第一个字段存放在$1中,第二个字段存放在$2中,倒数第二个字段存放在$(NF-1),最后一个字段存放在$NF中。$0则表示匹配到的整条记录。<br /> 4)如果读取到的记录与pattern想匹配,则执行器指定的action;若不匹配,则跳过action,直到完成所有的语句。<br /> 5)当以条输入记录处理完成之后,继续读取下一条记录,重复上面的动作,直到处理完全部的输入。若果输入的是文件列表,awk将按顺序处理列表中的文件。<br /> 6awk处理完所有的输入之后,若存在END语句块,则执行END语句块中的语句。<br /> BEGINEND语句都是可选的。<br />四、awk调用方式<br />主要有三种调用方式,分别为:<br /> 1) awk命令行<br /> 可以在命令行中使用awk 程序设计语言,也可以在shell script 程序中引用awk 命令行甚至awk 程序脚本。<br /> 2) 使用-f 选项调用awk 程序<br /> awk 允许将一段awk 程序写入一个文本文件,然后在awk 命令行中用-f 选项调用并执行这段程序。<br /> 3) 利用命令解释器调用awk 程序<br /> 利用命令解释器功能,我们可以将一段awk 程序写入文本文件,然后在它的第一行加上#!/bin/awk f.<br />五、awk使用详解<br />1print:用于输出指定的内容<br />print itemitem2,…<br />要点:<br />1)逗号分隔多个item<br /> 2)输出的各item可以为字符串,也可以是数值、当前记录的字段、变量、awk表达式<br /> 3)如省略item,相当于print $0,即输出被pattern匹配的记录。<br />2printf命令<br />用于格式化输出:printf Formatitem1item2,….<br />1Format 必须给出<br />2)不会自动换行,需要给出换行控制符,\n<br />3Format中需要分别为后面的每个item指定一个格式化符号。<br />格式符:<br /> %c:不现实字符本身,而是显示字符的ASCII码<br /> %d,%i:显示十进制整数<br /> %e,%E:以科学记数法数值显示<br /> %f:显示为浮点数<br /> %g,%G:以科学记数法或浮点数形式显示数值。<br /> %u:无符号整数<br /> %s:显示为字符串<br /> %%:显示%自身<br />修饰符:对格式符进行修饰<br /> #[.#]:第一个数字控制显示的宽度(度量值:字符数),第二个表示小数点后的精度<br /> %3.1f<br /> –:左对齐<br /> +:右对齐。默认为右对齐<br />3、变量<br />3.1 内建变量<br /> FS:input field separator,指定输入时的字段分隔符;默认为空白字符<br /> OFS:output field separator:指定输出时的字段分隔符;默认为空白字符<br /> RS:input record separator:指定输入时的换行符;默认为空白<br /> ORS:output record separator:指定输出时的换行符,默认为空白<br /> NF:number of field,每行的字段数量<br /> {print NF}<br /> $NF 标识最后一个字段<br /> NR:number of record,文件的行的数量<br /> FNR:若awk处理多个文件,则每个文件分别统计行数。若不指定,所有文件累计行数。<br /> FILENAME:当前文件名<br /> ARGC:命令行参数的<br /> ARGV:数组,保存的是命令行所给定的各参数<br />3.2 自定义变量<br /> (1)-v var=value<br /> 注意:变量名区分大小写<br /> (2)在program中直接定义<br />4、操作符<br /> 算术操作符:+ ,- ,* ,/ ,%, ^<br /> -n::转换为负数<br /> +n:将字符串转换为数值<br /> 字符串操作符:没有符号的操作符,表示连接字符串<br /> 赋值操作符:= ,+= ,-= ,*= ,/= ,^= ,%= ,++ ,–<br /> 比较操作符:< ,> ,<= ,>= ,==, !=<br /> 模式操作符:<br /> ~:左侧的字符串是否被右侧的模式所匹配<br /> !~:左侧的字符串是否被右侧的模式不匹配<br /> 逻辑操作符: && || !<br /> 函数调用:function_name(argu1,argu2…)<br /> 条件表达式:selector?if-true-expression:if-false-expression<br />5、PATTERN<br />5.1)empty:空模式,匹配每一行<br />5.2)/Regular Expression/:仅处理被模式匹配的每一行<br />5.3)relational expression:关系表达式;结果有“真”有“假”;结果为真的才被处理。<br />真:结果为非0值表示为真,非空字符串也表示为真<br />假:0表示为假,空字符串也表示为假<br />5.4)line ranges:指定行范围<br /> startline,endline:/part1/,/part2/<br /> 注意:不支持直接给出数字的格式。<br />5.5)BEGIN/END模式<br /> BEGIN{}:BEGIN 语句块在awk 开始从输入流中读取行之前被执行,这是一个可选的语句块,比如变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块。 END{}:END 语句块在awk 从输入流中读取完所有的行之后即被执行,比如打印所有行的分析结果这类信息汇总都是在END 语句块中完成,它也是一个可选语句。