仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 815|回复: 8
打印 上一主题 下一主题

[shell编程] 给大家带来CentOS Shell经常使用技能 awk

[复制链接]
小魔女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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


欢迎大家来到仓酷云论坛!
若相依 该用户已被删除
沙发
发表于 2015-1-15 22:56:38 | 只看该作者

给大家带来CentOS Shell经常使用技能 awk

一定要养成在命令行下工作的习惯,要知道X-window只是运行在命令行模式下的一个应用程序。在命令行下学习虽然一开始进度较慢。
简单生活 该用户已被删除
板凳
发表于 2015-1-21 10:27:49 | 只看该作者
如果你想深入学习Linux,看不懂因为文档实在是太难了。写的最好的、最全面的文档都是英语写的,最先发布的技术信息也都是用英语写的。
小妖女 该用户已被删除
地板
发表于 2015-1-30 15:05:05 | 只看该作者
Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。
再见西城 该用户已被删除
5#
发表于 2015-2-6 14:20:43 | 只看该作者
永中office 2004增强版安装只需要默认安装即可使用并操作大多与win系统雷同,打印机的配置和管理,记录光盘等。
透明 该用户已被删除
6#
发表于 2015-2-16 18:33:35 | 只看该作者
说实话小时候没想过搞IT,也计算机了解也只是一些皮毛,至于什么UNIX,Linux,听过没见过,就更别说用过了。?
谁可相欹 该用户已被删除
7#
发表于 2015-3-5 10:22:38 | 只看该作者
和私有操作系统不同,各个Linux的发行版本的技术支持时间都较短,这对于Linux初学者是往往不够的。
乐观 该用户已被删除
8#
发表于 2015-3-12 06:19:58 | 只看该作者
我们这一代90后,从小接触的是windows98,家里条件好的自己有电脑装的是2000,后来又有了XP,上大学时又有了win7。
老尸 该用户已被删除
9#
发表于 2015-3-19 22:14:19 | 只看该作者
熟悉系统的基本操作,Linux的图形界面直观,操作简便,多加上机练习就可熟悉操作,在Linux下学习办公软件等常用软件。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 10:06

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表