awk用法

awk用法

通用格式:awk'pattern{action}'file

cmd|awk'pattern{action}'

如果没有pattern,则对所有行都采用action,如果没有action,则打印匹配行。在pattern中可以使用各种定义的变量$0,,NF,NR等.

工作原理:awk扫描一行,放入变量$0中,然后行被分隔成各个域,以指定的分隔符进行分离,默认为空格,可以通过参数FS指定。各个域都存于变量$i中,至多100个域。

awk-F:'{print$1}'/etc/passwd打印所有用户名

格式化输出:

print支持使用转义字符,及OFMT变量定义的输出数字格式

awk'/Sally/{print"\t\tHaveaniceday,"$1,$2"\!"}'employees

awk'BEGIN{OFMT="%.2f";print1.2456789,12E2}'

printf支持C语言同名函数的所有功能

echo"UNIX"|awk'{printf"|%-15s|\n",$1}'

awk'{printf"Thenameis:%-15sIDis%8d\n",$1,$3}'employees

域分隔符:

awkF'[:\t]''{print$1,$2,$3}'employees

pattern:

模式可以是以下任意一个:

(1)/正则表达式/:使用通配符的扩展集。

(2)关系表达式:可以用下面运算符表中的关系运算符进行操作,可以是字符串或数字的比较,如$2>%1选择第二个字段比第一个字段长的行。

模式匹配表达式:用运算符~(匹配)和~!(不匹配)。用来在记录或者域内匹配正则表达式。如$awk'$1~/^root/'test将显示test文件第一列中以root开头的行。

BEGIN:让用户指定在第一条输入记录被处理之前所发生的动作,通常可在这里设置全局变量。

END:让用户在最后一条输入记录被读取之后发生的动作。

Action

{}中的Action的极其类似C语言的子句,里面可以嵌套子句,可以使用条件、循环、支持变量函数定义、使用自定义或内部变量、内部函数,调用系统命令,输入输出重定向等强大的能力。

变量:var=value,若变量没有初始化,字符串为"",数字为0。

awk'$1~/Tom/{wage=$2*$3;printwage}'filename

内置变量:

ARGCNumberofcommand-lineargument

ARGINDIndexinARGVofthecurrentfilebeingprocessedfromthecommandline(awkonly)

ARGVArrayofcommand-linearguments

CONVFMTConversionformatfornumbers,%.6g,bydefault(awkonly)

ENVIRONAnarraycontainingthevaluesofthecurrentenvironmentvariablespassedinfromtheshell

ERRNOContainsastringdescribingasystemerroroccurringfromredirectionwhenreadingfromthegetlinefunctionorwhenusingtheclosefunction(awkonly)

FIELDWIDTHSAwhitespace-separatedlistoffieldwidthsusedinsteadofFSwhensplittingrecordsoffixedfieldwidth(awkonly)

FILENAMENameofcurrentinputfile

FNRRecordnumberincurrentfile

FSTheinputfieldseparator,bydefaultaspace

IGNORECASETurnsoffcasesensitivityinregularexpressionsandstringoperations(awkonly)

NF当前记录的域个数,$NF可以引用到最后一个域

NR当前的记录序号

OFMTOutputformatfornumbers

OFSOutputfieldseparator

ORSOutputrecordseparator

RLENGTHLengthofstringmatchedbymatchfunction

RSInputrecordseparator

RSTARTOffsetofstringmatchedbymatchfunction

RTTherecordterminator;awksetsittotheinputtextthatmatchedthecharacterorregexspecifiedbyRS

SUBSEPSubscriptseparator

BEGIN模式后跟的ACTION,表示在awk处理文本以前进行的动作,可以用来初始化各种内部变量,或其他动作。

END模式后跟的ACTION,表示在awk处理结束后进行的动作。

重定向:

awk'$4>=70{print$1,$2>"passing_file"}'filename

awk'BEGIN{while("ls"|getline)print}'

条件语句

{if($3>89&&$379)Bgrade++

elseif($3>69)Cgrade++

elseif($3>59)Dgrade++

elseFgrade++

}

循环:支持while,for的的标准循环结构及break,continue等。

{

for(x=3;x正则表达式在string中的匹配位置

sprintf()返回指定格式的串

awk'{line=sprintf("%15s%6.2f",$1,$3);printline}'filename

sincosexpintlograndatan2sqrtsrand等

求子串经常用来格式化具有固定长但没有分隔符的域。而gsub通常用来替换某些无用的字符,使用替换后字符串更有意义。

自定义函数:

functionname(parameter,parameter,parameter,...)

{

statements

returnexpression

}

常用awk用法举例:

1、awk'/101/'file显示文件file中包含101的匹配行。

awk'/101/,/105/'file/pattern1/,/pattern2/显示两个匹配模式之间的行。在awk和sed下,如果模式2(pattern2)不出现,会显示匹配pattern1的所有行.

awk'$1==5'file

awk'$1=="CT"'file注意必须带双引号

awk'$1*$2>100'file

awk'$2>5&&$21000000'通过管道符获得输入,如:显示第4个域满足条件的行。

4、awk-F"|"'{print$1}'file按照新的分隔符"|"进行操作。

awk'BEGIN{FS="[:\t|]"}

{print$1,$2,$3}'file通过设置输入分隔符(FS="[:\t|]")修改输入分隔符。

注:awk缺省域分隔符是空格或TAB

Sep="|"

awk-F$Sep'{print$1}'file按照环境变量Sep的值做为分隔符。

awk-F'[:\t|]''{print$1}'file按照正则表达式的值做为分隔符,这里代表空格、:、TAB、|同时做为分隔符。

awk-F'[][]''{print$1}'file按照正则表达式的值做为分隔符,这里代表[、]

5、awk-fawkfilefile通过文件awkfile的内容依次进行控制。

catawkfile

/101/{print"\047Hello!\047"}--遇到匹配行以后打印'Hello!'.\047代表单引号。

{print$1,$2}--因为没有模式控制,打印每一行的前两个域。

6、awk'$1~/101/{print$1}'file显示文件中第一个域匹配101的行(记录)。

7、awk'BEGIN{OFS="%"}

{print$1,$2}'file通过设置输出分隔符(OFS="%")修改输出格式。

8、awk'BEGIN{max=100;print"max="max}BEGIN表示在处理任意行之前进行的操作。

{max=($1>max?$1:max);print$1,"Nowmaxis"max}'file取得文件第一个域的最大值。

(表达式1?表达式2:表达式3相当于:

if(表达式1)

表达式2

else

表达式3

awk'{print($1>4?"high"$1:"low"$1)}'file

9、awk'$1*$2>100{print$1}'file显示文件中第一个域匹配101的行(记录)。

10、awk'{$1=='Chi'{$3='China';print}'file找到匹配行后先将第3个域替换后再显示该行(记录)。

awk'{$7%=3;print$7}'file将第7域被3除,并将余数赋给第7域再打印。

11、awk'/tom/{wage=$2+$3;printfwage}'file找到匹配行后为变量wage赋值并打印该变量。

12、awk'/tom/{count++;}

END{print"tomwasfound"count"times"}'fileEND表示在所有输入行处理完后进行处理。

13、awk'gsub(/\$/,"");gsub(/,/,"");cost+=$4;

END{print"Thetotalis$"cost>"filename"}'filegsub函数用空串替换$和,再将结果输出到filename中。

123$1,200.00

123$2,300.00

123$4,000.00

相关推荐