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