|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
欢迎大家来到仓酷云论坛!awk有用功效:
和sed一样,awk也是逐行扫描文件的,从第一行到最初一行,寻觅婚配特定模板的行,并在这些行上运转“选择”举措。假如一个模板没有指定举措,这些婚配的行就被显现在屏幕上。假如一个举措没有模板,一切主动作指定的行都被处置。
1.awk的基础格局:
/>awkpatternfilename
/>awk{action}filename
/>awkpattern{action}filename
详细使用体例分离见以下三个用例:
/>catemployees
TomJones44245/12/66543354
MaryAdams534611/4/6328765
SallyChang16547/22/54650000
BillyBlack16839/23/44336500
/>awk/Mary/employees#打印一切包括模板Mary的行。
MaryAdams534611/4/6328765
#打印文件中的第一个字段,这个域在每行的入手下手,缺省由空格或别的分开符。
/>awk{print$1}employees
Tom
Mary
Sally
Billy
/>awk/Sally/{print$1,$2}employees#打印包括模板Sally的行的第1、第二个域字段。
SallyChang
2.awk的格局输入:
awk中同时供应了print和printf两种打印输入的函数,个中print函数的参数能够是变量、数值大概字符串。字符串必需用双引号援用,参数用逗号分开。假如没有逗号,参数就串连在一同而没法辨别。这里,逗号的感化与输入文件的分开符的感化是一样的,只是后者是空格罢了。上面给出基础的转码序列:
转码寄义
换行回车 制表符
/>date|awk{print"Month:"$2"
Year:",$6}
Month:Oct
Year:2011
/>awk/Sally/{print" Haveaniceday,"$1,$2"!"}employees
Haveaniceday,SallyChang!
在打印数字的时分你大概想把持数字的格局,我们一般用printf来完成这个功效。awk的特别变量OFMT也能够在利用print函数的时分,把持数字的打印格局。它的默许值是"%.6g"----小数点前面6位将被打印。
/>awkBEGIN{OFMT="%.2f";print1.2456789,12E-2}
1.250.12
如今我们先容一下功效更加壮大的printf函数,其用法和c言语中printf基础类似。上面我们给出awk中printf的格局化申明符列表:
格局化申明符功效示例了局%c打印单个ASCII字符。printf("Thecharacteris%c.
",x)ThecharacterisA.%d打印十进制数。printf("Theboyis%dyearsold.
",y)Theboyis15yearsold.%e打印用迷信记数法暗示的数。printf("zis%e.
",z)zis2.3e+01.%f打印浮点数。printf("zis%f.
",z)zis2.300000%o打印八进制数。printf("yis%o.
",y)yis17.%s打印字符串。printf("Thenameoftheculpritis%s.
",$1);ThenameoftheculpritisBobSmith.%x打印十六进制数。printf("yis%x.
",y)yisf.注:假定列表中的变脸值为x=A,y=15,z=2.3,$1="BobSmith"
/>echo"Linux"|awk{printf"|%-15s|
",$1}#%-15s暗示保存15个字符的空间,同时左对齐。
|Linux|
/>echo"Linux"|awk{printf"|%15s|
",$1}#%-15s暗示保存15个字符的空间,同时右对齐。
|Linux|
#%8d暗示数字右对齐,保存8个字符的空间。
/>awk{printf"Thenameis%-15sIDis%8d
",$1,$3}employees
ThenameisTomIDis4424
ThenameisMaryIDis5346
ThenameisSallyIDis1654
ThenameisBillyIDis1683
3.awk中的纪录和域:
awk中默许的纪录分开符是回车,保留在其内建变量ORS和RS中。$0变量是指整笔记录。
/>awk{print$0}employees#这同等于print的默许举动。
TomJones44245/12/66543354
MaryAdams534611/4/6328765
SallyChang16547/22/54650000
BillyBlack16839/23/44336500
变量NR(NumberofRecord),纪录每笔记录的编号。
/>awk{printNR,$0}employees
1TomJones44245/12/66543354
2MaryAdams534611/4/6328765
3SallyChang16547/22/54650000
4BillyBlack16839/23/44336500
变量NF(NumberofField),纪录以后纪录有几域。
/>awk{print$0,NF}employees
TomJones44245/12/665433545
MaryAdams534611/4/63287655
SallyChang16547/22/546500005
BillyBlack16839/23/443365005
#依据employees天生employees2。sed的用法能够参考上一篇blog。
/>seds/[[:space:]]+([0-9])/:1/g;wemployees2employees
/>catemployees
TomJones:4424:5/12/66:543354
MaryAdams:5346:11/4/63:28765
SallyChang:1654:7/22/54:650000
BillyBlack:1683:9/23/44:336500
/>awk-F:/TomJones/{print$1,$2}employees2#这里-F选项前面的字符暗示分开符。
TomJones4424
变量OFS(OutputFieldSeperator)暗示输入字段间的分开符,缺省是空格。
/>awk-F:{OFS="?"};/Tom/{print$1,$2}employees2#在输入时,域字段间的分开符已是?(问号)了
TomJones?4424
关于awk而言,其形式局部将把持这举措局部的输出,只要切合形式前提的纪录才能够交由举措局部基本处置,而形式局部不但能够写成正则表达式(如下面的例子),awk还撑持前提表达式,如:
/>awk$3<4000{print}employees
SallyChang16547/22/54650000
BillyBlack16839/23/44336500
在花括号内,用分号分开的语句称为举措。假如形式在举措后面,形式将决意甚么时分收回举措。举措能够是一个语句或是一组语句。语句之间用分号分开,也能够用换行符,如:
pattern{actionstatement;actionstatement;etc.}or
pattern{
actionstatement
actionstatement
}
形式和举措通常为***在一同的。必要注重的是,举措是花括号内的语句。形式把持的举措是从第一个左花括号入手下手到第一个右花括号停止,以下:
/>awk$3<4000&&/Sally/{print}employees
SallyChang16547/22/54650000
4.婚配操纵符:
"~"用来在纪录大概域内婚配正则表达式。
/>awk$1~/[Bb]ill/employees#显现一切第一个域婚配Bill或bill的行。
BillyBlack16839/23/44336500
/>awk$1!~/[Bb]ill/employees#显现一切第一个域不婚配Bill或bill的行,个中!~暗示不婚配的意义。
TomJones44245/12/66543354
MaryAdams534611/4/6328765
SallyChang16547/22/54650000
5.awk的基础使用实例:
/>cattestfile
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
centralCTAnnStephens5.7.94513
/>awk/^north/testfile#打印一切以north开首的行。
northwestNWCharlesMain3.0.98334
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
/>awk/^(no|so)/testfile#打印一切以so和no开首的行。
northwestNWCharlesMain3.0.98334
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
/>awk$5~/.[7-9]+/testfile#第五个域字段婚配包括.(点),前面是7-9的数字。
southwestSWLewisDalsass2.7.8218
centralCTAnnStephens5.7.94513
/>awk$8~/[0-9][0-9]$/{print$8}testfile#第八个域以两个数字停止的打印。
34
23
18
15
17
20
13
十.awk表达式功效:
1.对照表达式:
对照表达式婚配那些只在前提为真时才运转的行。这些表达式使用干系运算符来对照数字和字符串。见以下awk撑持的前提表达式列表:
运算符寄义例子<小于x<y<=小于即是x<=y==即是x==y!=不即是x!=y>=年夜于即是x>=y>年夜于x>y~婚配x~/y/!~不婚配x!~/y//>catemployees
TomJones44245/12/66543354
MaryAdams534611/4/6328765
SallyChang16547/22/54650000
BillyBlack16839/23/44336500
/>awk$3==5346employees#打印第三个域即是5346的行。
MaryAdams534611/4/6328765
/>awk$3>5000{print$1}employees#打印第三个域年夜于5000的行的第一个域字段。
Mary
/>awk$2~/Adam/employess#打印第二个域婚配Adam的行。
MaryAdams534611/4/6328765
2.前提表达式:
前提表达式利用两个标记--问号和冒号给表达式赋值:conditionalexpression1?expression2:expressional3,其逻辑同等于C言语中的前提表达式。其对应的if/else语句以下:
{
if(expression1)
expression2
else
expression3
}
/>cattestfile
northwestNWCharlesMain3.0.98334
westernWESharonGray5.3.97523
southwestSWLewisDalsass2.7.8218
southernSOSuanChin5.1.95415
southeastSEPatriciaHemenway4.0.7417
easternEATBSavage4.4.84520
northeastNEAMMainJr.5.1.94313
northNOMargotWeber4.5.8959
centralCTAnnStephens5.7.94513
/>awkNR<=3{print($7>4?"high"$7:"low"$7)}testfile
low3
high5
low2
3.数学表达式:
运算能够在形式内举行,个中awk将一切的运算都视为浮点运算,见以下列表:
运算符寄义例子+加x+y-减x-y*乘x*y/除x/y%取余x%y^乘方x^y/>awk/southern/{print$5+10}testfile#假如纪录包括正则表达式southern,第五个域就加10并打印。
15.1
/>awk/southern/{print$8/2}testfile#假如纪录包括正则表达式southern,第八个域除以2并打印。
7.5
4.逻辑表达式:
见以下列表:
运算符寄义例子&&逻辑与a&&b||逻辑或a||b!逻辑非!a/>awk$8>10&&$8<17testfile#打印出第八个域的值年夜于10小于17的纪录。
southernSOSuanChin5.1.95415
centralCTAnnStephens5.7.94513
#打印第二个域即是NW,大概第一个域婚配south的行的第1、第二个域。
/>awk$2=="NW"||$1~/south/{print$1,$2}testfile
northwestNW
southwestSW
southernSO
southeastSE
/>awk!($8>13){print$8}testfile#打印第八个域字段不年夜于13的行的第八个域。
3
9
13
5.局限模板:
局限模板婚配从第一个模板的第一次呈现到第二个模板的第一次呈现,第一个模板的下一次呈现到第一个模板的下一次呈现等等。假如第一个模板婚配而第二个模板没有呈现,awk就显现到文件开端的一切行。
/>awk/^western/,/^eastern/{print$1}testfile#打印以western开首到eastern开首的纪录的第一个域。
westernWE
southwestSW
southernSO
southeastSE
easternEA
6.赋值标记:
#找到第三个域即是Ann的纪录,然后给该域从头赋值为Christian,以后再打印输入该纪录。
/>awk$3=="Ann"{$3="Christian";print}testfile
centralCTChristianStephens5.7.94513
/>awk/Ann/{$8+=12;print$8}testfile#找到包括Ann的纪录,并将该笔记录的第八个域的值+=12,最初再打印输入。
25
欢迎大家来到仓酷云论坛! |
|