收藏 分销(赏)

Awk学习笔记.doc

上传人:精**** 文档编号:1710702 上传时间:2024-05-08 格式:DOC 页数:18 大小:128KB
下载 相关 举报
Awk学习笔记.doc_第1页
第1页 / 共18页
Awk学习笔记.doc_第2页
第2页 / 共18页
Awk学习笔记.doc_第3页
第3页 / 共18页
Awk学习笔记.doc_第4页
第4页 / 共18页
Awk学习笔记.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、k学习笔记Table ofConnts1、ak简介、 aw命令格式与选项2、1、 awk得语法有两种形式2、2、命令选项3、 模式与操作、1、 模式3、 操作、 awk得环境变量5、 awk运算符6、 记录与域、1、 记录6、域6、3、 域分隔符7、 gawk专用正则表达式元字符、PSI字符集、 匹配操作符()10、 比较表达式1、 范围模板12、 一个验证passd文件有效性得例子13、 几个实例14、 awk编程14、 变量4、2、 GI模块14、3、 END模块14、 重定向与管道1、5、 条件语句14、循环14、 数组14、8、 k得内建函数1、 How-to1、wk简介awk就是一种

2、 编程语言,用于在liuxunix下对文本与数据进行处理。数据可以来自标准输入、一个或多个文件,或其它命令得输出。它支持用户自定义函数与动态正 则表达式等先进功能,就是linux/unix下得一个强大编程工具。它在命令行中使用,但更多就是作为脚本来使用。awk得处理文本与数据得方式就是这样得, 它逐行扫描文件,从第一行到最后一行,寻找匹配得特定模式得行,并在这些行上进行您想要得操作。如果没有指定处理动作,则把匹配得行显示到标准输出(屏 幕),如果没有指定模式,则所有被操作所指定得行都被处理。awk分别代表其作者姓氏得第一个字母。因为它得作者就是三个人,分别就是Alfre Aho、rn erng

3、han、tereinberger。gwk就是wk得GN版本,它提供了Bell实验室与N得一些扩展。下面介绍得ak就是以GU得g为例得,在 lnu系统中已把w链接到gawk,所以下面全部以awk进行介绍。、wk命令格式与选项2、1、得语法有两种形式 awk tos cri vr=val l(s) aw opons -f cptfl(s)、2、命令选项-F fs or fied-searaor fs指定输入文件折分隔 符,s就是一个字符串或者就是一个正则表达式,如-:。- vve -ain var=ale赋值一个用户定义变量。-fscrip-从脚本文件中读 取awk命令。-m nn and-mrn

4、对 nnn值设置内在限制,mf选项限制分配给nn得最大块数目;-m选项限制记录得最大数目。这两个功能就是Bl实验室版awk得扩展功能,在标准wk中不适用。-Wact or -pt, -W traoal or -trdiional在兼容模式下运行awk。所以g得行为与标准得w完全一样,所有得k扩展都被忽略。-W cplefor -opyleft, -Wcoyriht or -pyright打印简短得版权信息。-W elp o-hep,-W usage -ua打 印全部awk选项与每个选项得简短说明。-W linr -lint打印不能向传统ux平台移植得结构得警告。-W lnt-old or -l

5、n-old打印关于不能向传统ix平台移植得结构得警告。posix打开兼容模式。但有以下限制,不识别:x、函数关键字、uc、 换码序列以及当fs就是一个空格时,将新行作为一个域分隔符;操作符*与*=不能代替与=;flus无效。-W re-interval o -r-ierva允许间隔正则表达式 得使用,参考(rep中得Posix字符类),如括号表达式:alpha:。-W sucprrmt or -sourcrgam-text使用 prgm-xt作为源代码,可与-f命令混用。- eion or -vesin打印bu报告信息得版本。3、模式与操作ak脚本就是由模式与操作组成得:attern acti

6、o 如$ wk /rot/ te,或$ awk $3 100te。两者就是可选得,如果没有模式,则actin应用到全部记录,如果没有acton,则输出匹配全部记录。默认情况下,每一个输入行都就是一条记录,但用户 可通过S变量指定不同得分隔符进行分隔。、模式模式可以就是以下任意一个: 正则表达式/: 使用通配符得扩展集。 关系表达式:可以用下面运算符表中得关系运算符进行操作,可以就是字符串或数字得比较, 如2%1选择第二个字段比第一个字段长得行。 模式匹配表达式:用运算符(匹配)与!(不匹配)。 模式,模式:指定一个行得范围。该语法不能包括BEIN与ED模式。 GIN:让用户指定在第一条输入记录

7、被处理之 前所发生得动作,通常可在这里设置全局变量。 ND:让用户在最后一条输入记录被读取之后发生得动作。3、操作操 作由一人或多个命令、函数、表达式组成,之间由换行符或分号隔开,并位于大括号内。主要有四部份: 变量或数组赋值 输出命令 内置函数 控制流命令4、k得环境变量Tb1、awk得环境变量变量描述$当前记录得第n个字段,字段间由 FS分隔。0完整得输入记录。AG命令行参数得数目。N命令行中当前文件得位置(从0开始算)。AGV包含命令行参数得数组。CNVFMT数字转换格式(默认值为%、6g)NVIRON环 境变量关联数组。EN最后一个系统错误得描述。FILDWID字 段宽度列表(用空格键

8、分隔)。当前文件名。FN同R,但相对于当前文件。字段分隔符(默认就是任何空格)。IGNOCAS如果为真,则进行忽略大小写得匹配。NF当前记录中得字段数。当前记录数。OFMT数字得输出格式(默认值就是%、6)。OFS输 出字段分隔符(默认值就是一个空格)。RS输出记录分隔符(默认值就是一个换行符)。RNGTH由mach函数所匹配得字符串得长度。记录分隔符(默认就是一个换行符)。S由 mtch函数所匹配得字符串得第一个位置。SUBEP数组下标分隔符(默认值就是034)。5、awk运算符Tale2、运算符运 算符描述 += -= *= / %= *=赋值?:C条件表达式|逻 辑或&逻辑与 !匹 配正

9、则表达式与不匹配正则表达式 !=关 系运算符空格连接+ -加,减* / &乘,除与求余+ !一元加,减与逻辑非*求幂+-增加或减少,作为前缀或后缀$字 段引用in数组成员6、记录与域6、记录w 把每一个以换行符结束得行称为一个记录。记录分隔符:默认得输入与输出得分隔符都就是回车,保存在内建变量OR与RS中。0 变量:它指得就是整条记录。如$ kprnt 0 ts将输出test文件中得所有记录。变量N:一个计数器,每处 理完一条记录,NR得值就增加1。如 awkrintN,tst将输出test文件中所有记录,并在记录前显示记录号。6、2、域记 录中每个单词称做“域”,默认情况下以空格或ab分隔。

10、wk可跟踪域得个数,并在内建变量NF中保存该值。如$ awk print 1,$3 tet将打印est文件中第一与第三个以空格分开得列(域)。6、3、域分隔符内建变量 保存输入域分隔符得值,默认就是空格或tab。我们可以通过-F命令行选项修改F得值。如$ awk -F: print$1,$5 tes将打印以冒号为分隔符得第一,第五列得内容。可以同时使用多个域分隔符,这时应该把分隔符写成放到方括号中,如$aw -F:t pin 1,3es,表示以空格、冒号与ab作为分隔符。输出域得分隔符默认就是一个空格,保 存在OFS中。如$ awk -F: prnt $1,5 test,$1与$5间得逗号就就

11、是OFS得值。、aw专用正则表达 式元字符一般通用得元字符集就不讲了,可参考我得Se与Grep学习笔记。以下几个就是aw专用得,不适合nix版本得awk。Y匹配一个单词开头或者末尾得空字符串。B匹配单词 内得空字符串。匹配一个单 词得末尾得空字符串,锚定末尾。w匹配一个 字母数字组成得单词。W匹配一个非字母数字组成得单词。匹配字符串开头得一个空字符串。匹配字符串末尾得一个空字符串。、OI字符集可 参考我得Grep学习笔记9、匹配操作符()用来在 记录或者域内匹配正则表达式。如$ aw 1 /oot test将显示te文件第一列中以root开头得行。10、比较表达式codiioal exprss

12、ion ? exprssion2: epressin3,例如:$ awk ma = 1 $3 ? $: $:prit ma test。如果第一个域大于第三个域,$1就赋值给max,否则$3就赋值给mx。 wk 1 + $2 5 &$2 0 et,如果第一个域大于5,并且第二个域小于10,则打印这些行。1、范围模板范围模板匹配从第一个模板得第一次出现到第二个模板得第一次出现之间所有行。如果有一个模板没出现,则匹配到开头或末尾。如$ w /root/,mysqltet将显示root第一次出现到msql第一次出现之间得所有行。12、一个验证 aswd文件有效性得例子$ cat /e/ad awk -

13、F: != 7prnf(le %,does t ave 7 fiels:sn,NR,$0)$1! /A-a-z-9rint(lne %d,nn alphan numeric useri:%d: %sn,R,$0)$2 =* ritf(lne %, no passwod: s,R,$0)cat把结果输出给 awk,k把域之间得分隔符设为冒号。如果域得数量(NF)不等于7,就执行下面得程序。rintf打印字 符串ne ?oes hav fieds,并显示该条记录。如果第一个域没有包 含任何字母与数字,printf打印“no aand numric user ,并显示记录数与记录。如果第二个域就是一

14、个星号,就打印字符串“n paswd”,紧跟着显示记录数与记录本身。13、几个实例 a /(no|o)/ t-打印所有以模式o或s开头得行。 $awk ns/prnt $1 s-如果记录以n或s开头,就打印这个记录。 $ aw1 /-909$/(prin $1 test-如果第一个域以两个数字结束就打印这个记录。 ak$1 =10| $2 5 ?ok $1: error1)e-如果第一个域大于5则打印问号后面得表达式值,否则打印冒号后面得表达式值。 $ aw /oot,msq tet-打印以正则表达式ro开头得记录到以正则表达式mysl开头得记录范围内得所有记录。如果找到一个新得正则表达式ro

15、ot开头得记录,则继续打印直到下一个以正则表达式myql开头得记录为止,或到文件末尾。14、awk编程4、变量 在aw中,变量不需要定义就可以直接使用,变量类型可以 就是数字或字符串。 赋值格式:Vaiabe erssin,如 $1 /est/out=2 + $; prin unt tes,上式得作用就是,w先扫描第一个域,一旦tet匹配,就把第二个域得值加上第三个域得值,并把结果赋值给变量ount,最后打印出来。 ak 可以在命令行中给变量赋值,然后将这个变量传输给awk脚本。如$ aw -F: -fasci mon= ye=200 st,上式得mt与yea都就是自定义变量,分别被赋值为4与

16、204。在awk脚本中,这些变量使用起来就象就是在脚本中建立得一样。注意,如 果参数前面出现tst,那么在GN语句中得变量就不能被使用。 域变量也可被赋值与修改,如$wk 2 =100 $1; pnt test,上式表示,如果第二个域不存在,awk将计算表达式100加1得值,并将其赋值给$2,如果第二个域存在,则用表达式得值覆盖$2原来得值。 再例如:$ awk$1=rot=test;prnt test,如果第一个域得值就是“roo”,则把它赋值为“st”,注意,字符串一定要用双引号。 内建变量得使用。 变量列表在前面已列出,现在举个例子说明一下。$ w -:IGOREASE=1; 1 = A

17、RYpint R,$1,2,$NFtst,把GRECASE设为1代表忽略大小写,打印第一个域就是mary得记录数、第一个域、第二个域与最后一个 域。1、2、BEGN 模块BEGI模块后紧跟着动作块,这个动作块在aw处理任何输入文件之前执行。所以它可以在没有任何输入得情况下进行测试。它通常用来改变内建变量得值,如OFS,R与FS等,以及打印标题。如:$aw BGIFS=:; OFS=; ORS=nnprint $1,2,$3 test。上式表示,在处理输入文件以前,域分隔符(FS)被设为冒号,输出文件分隔符(OS)被设置为制表符,输出记录分隔符(ORS)被设置为两个 换行符。$w EGINpri

18、nt TITLE ET只打印标题。14、3、END模块END 不匹配任何得输入文件,但就是执行动作块中得所有动作,它在整个输入文件处理完成后被执行。如$ w EDprnt The umb of rerdsis NR test,上式将打印所有被处理得记录数。14、重定向与管道 w可使用shel得重定向符进行重定向输出,如:$ ak$1 = 100 rt $1 oututfile test。上式表示如果第一个域得值等于00,则把它输出到oupufile中。也可以用来重定向输出,但不清空文件,只做追加操作。 输出重定向需用到getline函数。gtli从标准输入、管道或者当前正在处理得文件之外得其她

19、输入文件 获得输入。它负责从输入获得下一行得内容,并给NF,NR与FR等内建变量赋值。如果得到一条记录,gelin函数返回1,如果到达文件得末尾就返 回0,如果出现错误,例如打开文件失败,就返回-1。如: awkBGIN de | getlne d; pritdtst。执行liux得ae命令,并通过管道输出给etine,然后再把输出赋值给自定义变量d,并打印它。$ aw BEGIate | getne d; slit(d,mon); rint on2te。执行shell得ate命令,并通过管道输出给eline,然后geln从管道中读取并将输入赋值给d,plit函数把变量d转 化成数组mon,然

20、后打印数组mon得第二个元素。$ awkBEGINwhi( l| getline) pin,命令s得输出传递给glne作为输入,循环使eine从l得输出中读取一行,并把它打印到屏幕。这里没有输入文件,因为 EGIN块在打开输入文件前执行,所以可以忽略输入文件。 awk BEGNprint hatisyou nae?; getli e dev/tty $ namepitFound naeo in , N、Eint eeyou,me 、 test。在屏幕上打印”What i yu nae?,并等待用户应答。当一行输入完毕后,getne函数从终端接收该行输入,并把它储存在自定义变量nae中。如果第一

21、个域匹配变量 name得值,print函数就被执行,ND块打印Seeou与me得值。a BEGINwhile (gne /etc/passw 0) lc+; prntlc。awk将逐行读取文件/etc/asswd得内容,在到达文件末尾前,计数器c一直增加,当到末尾时,打印l得值。注意,如果文件不存在,gine返回-1,如果到达文件得末尾就返回,如果读到一行,就返回1,所以命令 wile (etine /ec/passwd)在文件不存在得情况下将陷入无限循环,因为返回-1表示逻辑真。 可以在a中打开一个管 道,且同一时刻只能有一个管道存在。通过close()可关闭管道。如:$ akprit, $

22、2 | sort tst ENDclos(sort)。awd把print语句得输出通过管道作为linu命令st得输入,END块执行关闭管道操作。 ystem函数可以在awk中执行linx得命令。如: awkBEINyem(cler)。 flus函数用以刷新输出缓冲区,如果没有参数,就刷新标准输出得缓冲区,如果以空字符串为参数,如fflus(),则刷新所有文件与管道得输出缓冲区。1、5、条件语句awk 中得条件语句就是从C语言中借鉴过来得,可控制程序得流程。1、5、1、if 语句格式: i (expression) statemet; statemen;、 k if ($10)prnt$ bd;

23、 eleprn oktest。如果$1大于00则打印1bad,否则打印k。 aw f ($1 0) count+;print$1 else ount-;pn $ es。如果1大于0,则cout加一,并打印$1,否则cunt减一,并打印$1。1、if/ele eif语句,用于多重判断。格式: if (eession) staeent; sateet; 、 es i (exrssio) statemet; statement; 、 else if (expreson) stamt;staemen; 、 else temn; staement;、 14、循 环 awk有三种循环:while循环;or

24、循环;special fr循环。 ak i = 1; while ( i=F ) prit N,$i; i+test。变量得初始值为,若i小于可等于F(记录中域得个数),则执行打印语句,且i增加1。直到得值大于NF、 $ aw for (i =; iNF; ) rnt NF,$i ts。作用同上。 radkcontinue语句。reak用于在满足条件得情况下跳出循环;continue用于在满足条件得情况下忽略后面得语句,直接返回循环得顶端。如: for ( x=3; x=N;x+) i (x)rintome o!; break r ( x3; x=NF; x+) if($x=0)print G

25、e net iem;cntnu ne语句从输入文件中读取一行,然后从头开始执行awk脚本。如: i ($1 /test/)xt elseprint exit语句用于结束awk程序,但不会略过END块。退出状态为0代表成功,非零值表示出错。1、数组aw中得数组得下标可以就是数字与字母,称为关联数组。14、7、1、下标与关联数组 用变量作为数组下标。如:$ awk namex+=$2;Nfor(i0;iR;i+) printi,ami tes。数组nme中得下标就是一个自定义变量x,awk初始化x得值为,在每次使用后增加1。第二个域得值被赋给me数组得各个元素。在END模块中,for循环被用于循环

26、整个数组,从下标为0得元素开始,打印那些存储在数组中得值。因为下标就是关健字,所以它不一定从开始,可以从任何值开始。 special r循环用于读取关联数组中得元素。格式如下: f(item narynam) pint arranamitem awk tomnameNR=$1; EDor(i i nae)prin namei s。打印有值得数组元素。打印得顺序就是随机得。 用字符串作为下标。如:counttest 用域值作为数组得下标。一种新得 or循环方式,for (nx_lu in arra)taent。如:$awk cont$1+ ENDfo(na i count)rint name,c

27、ontname test。该语句将打印$1中字符串出现得次数。它首先以第一个域作数组count得下标,第一个域变化,索引就变化。 delete 函数用于删除数组元素。如:wk inex+=1 ENo(x i line)deee(lix)ts。分配给数组li得就是第一个域得值,所有记录处理完成后,scial or循环将删除每一个元素。14、a得内建函数14、8、字符串函数 su函数匹配记录中最大、最靠左边得子字符串得正则表达 式,并用替换字符串替换这些字符串。如果没有指定目标字符串就默认使用整个记录。替换只发生在第一次匹配得时候。格式如下: su (regua eressio, subsuton

28、tring): su (regua expressin, substitionsting,targe ti)实例: $ ak su(/tes, mytst); pint ttfile $ ak (/s/, yt);$; pint ttfil第一个例子在整个记录中匹配,替换只发生在第一次匹配发生得时候。如要在整个文件中进行匹配需要用到gsub第二个例子在整个记录得第一个域中进行匹配,替换只发生在第一次匹配发生得时候。 gs函数作用如sub,但它在整个文档中进行匹配。格式如下: gub (reula expessio,substitution tring) gsub (regularexrsion

29、, substitution stri,tarting)实例: $ awk ub(/et, myet);prin estile $aw gsub(et/,mt), 1 ;prt ttfile第一个例子在整个文档中匹配tet,匹配得都被替换成myt。第二个例子在整个文档得第一个域中匹配,所有匹配 得都被替换成mytet。 ix函数返回子字符串第一次被匹配得位置,偏移量从位置1开始。格式如下: idex(trng, ubstring)实例: $ awk prnt index(tes, mytes) tesfle实例返回test在ytes得位置,结果应该就是3。 legth函数返回记录得字符数。格式

30、如 下: egth( srng) legh实例: aw prntengt( est) $ awk in lngth testfile第一个实例返回test字符串得长度。第二个实例返回tsfle文件中第条记录得字符数。 sbstr 函数返回从位置1开始得子字符串,如果指定长度超过实际长度,就返回整个字符串。格式如下: substr(in,startng psition ) sutr( stri, srting poition,engt oftrin )实例: $ awpri usr( ell ol, 7,1) 上例截取了worl子字符串。 mtch函数返回在字符串中正则表达式位置得索引,如果找不

31、到指定 得正则表达式则返回0。match函数会设置内建变量RTT为字符串中子字符串得开始位置,RLENGT为到子字符串末尾得字符个数。 substr可利于这些变量来截取字符串。函数格式如下: th( srng, egular xpressi )实例: $ ak sart=atch(ths is a est,/a-z/); print star $ awk tt=match(ti is a test,/a-+$/); rin sart, RSTART, RLENTH第一个实例打印以连续小写字符结尾得开始位置,这里就是11。第二个实例还打印RSART与RLENT变量,这里就是1(sart),1(R

32、START),4(LENGTH)。 oupe与oow函数可用于字符串大小间得转换,该功能只在aw中有效。格式如下: touper(tring ) tolor( stig )实例: awk rinttpr(tt), olower(TST) sli函数可按给定得分隔符把字符串分割为一个数组。如果分隔符没提供,则按当前S值进行分割。格式如下: spit( string,aray, eld separtor ) spt( ring, rray)实例: $ akspl( 2:18:0, time, : ); prnttime2上例把时间按冒号分割到t数组内,并显示第二个数组元素1。14、时间函数 syt

33、ime函数返回从190年1月1日开始到当前时 间(不计闰年)得整秒数。格式如下: sysim()实例: $ wk now ye(); prnt now strti函数使用C库中得strfime函数格式化时间。格式如下: sysm( forma sciicio,timesamp )Tbe3、日期与时间格式说明符格式描述%a星期几得缩写(un)%A星 期几得完整写法(ud)b月名得缩写(O)%B月名得完整写法(Octoer)%c本地日期与时间%d十 进制日期D日期 0/20/99%e日 期,如果只有一位会补上一个空格%H用十进制表示24小时格式得小时%用 十进制表示12小时格式得小时%从1月1日起

34、一年中得第几天%m十进制表示得月份%M十进制表示得分钟%1小时表示法(AM/P)%S十进制表示得秒%U十 进制表示得一年中得第几个星期(星期天作为一个星期得开始)%十进制表示得星期几(星期天就是 0)十进制表示得一年中得第几个星期(星期一作为一个星期得开始)%重 新设置本地日期(8/209)%X重新设置本地时间(1:00:0)y两 位数字表示得年(99)%Y当前月份Z时区(PDT)%百分号(%)实 例: aw ow=stftie( D,sysime() ); rn n $wk n=rftime(%m/%d/%y);pinow 14、3、内 建数学函数Table、函数名称返回值atan2(x,y

35、)y,x范围内得余切cos(x)余弦函数exp(x)求幂int(x)取整log()自然对数rand()随 机数sin(x)正弦st()平 方根srand(x)x就是ad()函数得种子int(x)取整,过程没有舍入rand()产生一个大于等于0而小于1得随机数14.8.4、自定义函数在wk中还可自定义函数,格式如下: function name ( prmeter,pametr, paraeter, 、 ) sttements retur epressin the rtrn tteentan essio are ptiona 15、Hw-o 如何把一行竖排得数据转换成横排?wk prntf(%s,,)

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服