awk使用手册
什么是awk?
ä½ å?¯èƒ½å¯¹UNIXæ¯”è¾ƒç†Ÿæ‚‰ï¼Œä½†ä½ å?¯èƒ½å¯¹awk很陌生,这一点也ä¸?奇怪,的确,与其优秀的功能相比,awk还远没达到它应有的知å??度。awk是什么?与其它大多数UNIX命令ä¸?å?Œçš„æ˜¯ï¼Œä»Žå??å—上看,我们ä¸?å?¯èƒ½çŸ¥é?“awk的功能:它既ä¸?是具有独立æ„?义的英文å?•è¯?,也ä¸?æ˜¯å‡ ä¸ªç›¸å…³å?•è¯?的缩写。事实上,awk是三个人å??的缩写,他们是:Ahoã€?(Peter)Weinbergå’Œ (Brain)Kernighanã€‚æ£æ˜¯è¿™ä¸‰ä¸ªäººåˆ›é€ 了awk—ä¸€ä¸ªä¼˜ç§€çš„æ ·å¼?扫æ??与处ç?†å·¥å…·ã€‚
AWK的功能是什么?与sedå’Œ grep很相似,awk是一ç§?æ ·å¼?扫æ??与处ç?†å·¥å…·ã€‚但其功能å?´å¤§å¤§å¼ºäºŽsedå’Œgrep。awkæ??供了æž?å…¶å¼ºå¤§çš„åŠŸèƒ½ï¼šå®ƒå‡ ä¹Žå?¯ä»¥å®Œæˆ?grepå’Œsed所能完æˆ?的全部工作,å?Œæ—¶ï¼Œå®ƒè¿˜å?¯ä»¥å?¯ä»¥è¿›è¡Œæ ·å¼?装入ã€?æµ?控制ã€?æ•°å¦è¿?算符ã€?进程控制è¯å?¥ç”šè‡³äºŽå†…置的å?˜é‡?和函数。它具备了一个完整的è¯è¨€æ‰€åº”å…·æœ‰çš„å‡ ä¹Žæ‰€æœ‰ç²¾ç¾Žç‰¹æ€§ã€‚å®žé™…ä¸Šï¼Œawk的确拥有自己的è¯è¨€ï¼šawk程åº?设计è¯è¨€ï¼Œawk的三ä½?创建者已将它æ£å¼?å®šä¹‰ä¸ºï¼šæ ·å¼?扫æ??和处ç?†è¯è¨€ã€‚
为什么使用awk?
å?³ä½¿å¦‚æ¤ï¼Œä½ 也许ä»?然会问,我为什么è¦?使用awk?
使用awk的第一个ç?†ç”±æ˜¯åŸºäºŽæ–‡æœ¬çš„æ ·å¼?扫æ??和处ç?†æ˜¯æˆ‘们ç»?常å?šçš„工作,awk所å?šçš„工作有些象数æ?®åº“,但与数æ?®åº“ä¸?å?Œçš„æ˜¯ï¼Œå®ƒå¤„ç?†çš„æ˜¯æ–‡æœ¬æ–‡ä»¶ï¼Œè¿™äº›æ–‡ä»¶æ²¡æœ‰ä¸“门的å˜å‚¨æ ¼å¼?,普通的人们就能编辑ã€?阅读ã€?ç?†è§£å’Œå¤„ç?†å®ƒä»¬ã€‚而数æ?®åº“文件往往具有特殊的å˜å‚¨æ ¼å¼?,这使得它们必须用数æ?®åº“处ç?†ç¨‹åº?æ?¥å¤„ç?†å®ƒä»¬ã€‚既然这ç§?类似于数æ?®åº“的处ç?†å·¥ä½œæˆ‘们ç»?常会é?‡åˆ°ï¼Œæˆ‘们就应当找到处ç?†å®ƒä»¬çš„简便易行的方法,UNIX有很多这方é?¢çš„工具,例如sed ã€?grepã€?sort以å?Šfindç‰ç‰ï¼Œawk是其ä¸å??分优秀的一ç§?。
使用awk的第二个ç?†ç”±æ˜¯awk是一个简å?•的工具,当然这是相对于其强大的功能æ?¥è¯´çš„。的确,UNIX有许多优秀的工具,例如UNIX天然的开å?‘工具Cè¯è¨€å?Šå…¶å»¶ç»C++å°±é?žå¸¸çš„优秀。但相对于它们æ?¥è¯´ï¼Œawk完æˆ?å?Œæ ·çš„功能è¦?方便和简æ?·å¾—å¤šã€‚è¿™é¦–å…ˆæ˜¯å› ä¸ºawkæ??供了适应多ç§?需è¦?的解决方案:从解决简å?•问题的awk命令行到å¤?æ?‚而精巧的awk程åº?设计è¯è¨€ï¼Œè¿™æ ·å?šçš„å¥½å¤„æ˜¯ï¼Œä½ å?¯ä»¥ä¸?必用å¤?æ?‚的方法去解决本æ?¥å¾ˆç®€å?•çš„é—®é¢˜ã€‚ä¾‹å¦‚ï¼Œä½ å?¯ä»¥ç”¨ä¸€ä¸ªå‘½ä»¤è¡Œè§£å†³ç®€å?•的问题,而Cä¸?行,å?³ä½¿ä¸€ä¸ªå†?简å?•的程åº?,Cè¯è¨€ä¹Ÿå¿…é¡»ç»?过编写ã€?编译的全过程。其次,awk本身是解释执行的,这就使得awk程åº?ä¸?å¿…ç»?过编译的过程,å?Œæ—¶ï¼Œè¿™ä¹Ÿä½¿å¾—它与shell script程åº?能够很好的契å?ˆã€‚最å?Žï¼Œawk本身较Cè¯è¨€ç®€å?•,虽然awkå?¸æ”¶äº†Cè¯è¨€å¾ˆå¤šä¼˜ç§€çš„æˆ?分,熟悉Cè¯è¨€ä¼šå¯¹å¦ä¹ awk有很大的帮助,但 awk本身ä¸?é¡»è¦?会使用Cè¯è¨€â€”—一ç§?功能强大但需è¦?大é‡?æ—¶é—´å¦ä¹ æ‰?能掌æ?¡å…¶æŠ€å·§çš„å¼€å?‘工具。
使用awk的第三个ç?†ç”±æ˜¯awk是一个容易获得的工具。与Cå’ŒC++è¯è¨€ä¸?å?Œï¼Œawkå?ªæœ‰ä¸€ä¸ªæ–‡ä»¶(/bin/awk)ï¼Œè€Œä¸”å‡ ä¹Žæ¯?个版本的UNIX都æ??ä¾›å?„自版本的awkï¼Œä½ å®Œå…¨ä¸?必费心去想如何获得awk。但Cè¯è¨€å?´ä¸?æ˜¯è¿™æ ·ï¼Œè™½ç„¶Cè¯è¨€æ˜¯UNIX天然的开å?‘工具,但这个开å?‘工具å?´æ˜¯å?•独å?‘行的,æ?¢è¨€ä¹‹ï¼Œä½ å¿…é¡»ä¸ºä½ çš„UNIX版本的Cè¯è¨€å¼€å?‘工具å?•独付费(当然使用D版者除外),获得并安装它,然å?Žä½ æ‰?å?¯ä»¥ä½¿ç”¨å®ƒã€‚
基于以上ç?†ç”±ï¼Œå†?åŠ ä¸Šawk强大的功能,我们有ç?†ç”±è¯´ï¼Œå¦‚æžœä½ è¦?处ç?†ä¸Žæ–‡æœ¬æ ·å¼?扫æ??相关的工作,awkåº”è¯¥æ˜¯ä½ çš„ç¬¬ä¸€é€‰æ‹©ã€‚åœ¨è¿™é‡Œæœ‰ä¸€ä¸ªå?¯é?µå¾ªçš„ä¸€èˆ¬åŽŸåˆ™ï¼šå¦‚æžœä½ ç”¨æ™®é€šçš„shell工具或shell script有困难的è¯?,试试awk,如果awkä»?ä¸?能解决问题,则便用Cè¯è¨€ï¼Œå¦‚æžœCè¯è¨€ä»?然失败,则移至C++。
awk的调用方�
å‰?é?¢æ›¾ç»?说过,awkæ??供了适应多ç§?需è¦?çš„ä¸?å?Œè§£å†³æ–¹æ¡ˆï¼Œå®ƒä»¬æ˜¯ï¼š
一ã€? awkå‘½ä»¤è¡Œï¼Œä½ å?¯ä»¥è±¡ä½¿ç”¨æ™®é€šUNIXå‘½ä»¤ä¸€æ ·ä½¿ç”¨awk,在命令行ä¸ä½ 也å?¯ä»¥ä½¿ç”¨awk程åº?设计è¯è¨€ï¼Œè™½ç„¶awk支æŒ?多行的录入,但是录入长长的命令行并ä¿?è¯?å…¶æ£ç¡®æ— 误å?´æ˜¯ä¸€ä»¶ä»¤äººå¤´ç–¼çš„äº‹ï¼Œå› æ¤ï¼Œè¿™ç§?方法一般å?ªç”¨äºŽè§£å†³ç®€å?•çš„é—®é¢˜ã€‚å½“ç„¶ï¼Œä½ ä¹Ÿå?¯ä»¥åœ¨shell script程åº?ä¸å¼•用awk命令行甚至awk程åº?脚本。
二ã€?使用-f选项调用awk程åº?。awkå…?许将一段awk程åº?写入一个文本文件,然å?Žåœ¨awk命令行ä¸ç”¨-f选项调用并执行这段程åº?。具体的方法我们将在å?Žé?¢çš„awkè¯æ³•ä¸è®²åˆ°ã€‚
三ã€?利用命令解释器调用awk程åº?:利用UNIX支æŒ?的命令解释器功能,我们å?¯ä»¥å°†ä¸€æ®µawk程åº?写入文本文件,然å?Žåœ¨å®ƒçš„ç¬¬ä¸€è¡ŒåŠ ä¸Š:
#!/bin/awk -f
并赋予这个文本文件以执行的æ?ƒé™?ã€‚è¿™æ ·å?šä¹‹å?Žï¼Œä½ å°±å?¯ä»¥åœ¨å‘½ä»¤è¡Œä¸ç”¨ç±»ä¼¼äºŽä¸‹é?¢è¿™æ ·çš„æ–¹å¼?调用并执行这段awk程åº?了。
$awk脚本文本å?? 待处ç?†æ–‡ä»¶
awkçš„è¯æ³•:
与其它UNIXå‘½ä»¤ä¸€æ ·ï¼Œawkæ‹¥æœ‰è‡ªå·±çš„è¯æ³•:
awk [ -F re] [parameter...] ['prog'] [-f progfile][in_file...]
�数说明:
-F re:å…?许awkæ›´æ”¹å…¶å—æ®µåˆ†éš”符。
parameter: 该�数帮助为��的��赋值。
‘prog’: awk的程åº?è¯å?¥æ®µã€‚这个è¯å?¥æ®µå¿…须用å?•æ‹“å?·ï¼š’å’Œ’括起,以防被shell解释。这个程åº?è¯å?¥æ®µçš„æ ‡å‡†å½¢å¼?为:
‘pattern {action}’
å…¶ä¸patternå?‚æ•°å?¯ä»¥æ˜¯egrepæ£åˆ™è¡¨è¾¾å¼?ä¸çš„任何一个,它å?¯ä»¥ä½¿ç”¨è¯æ³•/re/å†?åŠ ä¸Šä¸€äº›æ ·å¼?匹é…?技巧构æˆ?。与sedç±»ä¼¼ï¼Œä½ ä¹Ÿå?¯ä»¥ä½¿ç”¨”,”åˆ†å¼€ä¸¤æ ·å¼?以选择æŸ?个范围。关于匹é…?çš„ç»†èŠ‚ï¼Œä½ å?¯ä»¥å?‚考附录,如果ä»?ä¸?懂的è¯?,找本UNIX书å¦å¦grepå’Œsed(本人是在å¦ä¹ ed时掌æ?¡åŒ¹é…?技术的)。 actionå?‚数总是被大括å?·åŒ…围,它由一系统awkè¯å?¥ç»„æˆ?,å?„è¯å?¥ä¹‹é—´ç”¨”;”分隔。awk解释它们,并在patternç»™å®šçš„æ ·å¼?匹é…?的记录上执行其æ“?作。与shellç±»ä¼¼ï¼Œä½ ä¹Ÿå?¯ä»¥ä½¿ç”¨â€œ#â€?作为注释符,它使“#â€?到行尾的内容æˆ?ä¸ºæ³¨é‡Šï¼Œåœ¨è§£é‡Šæ‰§è¡Œæ—¶ï¼Œå®ƒä»¬å°†è¢«å¿½ç•¥ã€‚ä½ å?¯ä»¥çœ?ç•¥patternå’Œ action之一,但ä¸?能两者å?Œæ—¶çœ?略,当çœ?ç•¥patternæ—¶æ²¡æœ‰æ ·å¼?匹é…?,表示对所有行(记录)å?‡æ‰§è¡Œæ“?作,çœ?ç•¥action时执行缺çœ?çš„æ“?ä½œâ€”â€”åœ¨æ ‡å‡†è¾“å‡ºä¸Šæ˜¾ç¤ºã€‚
-f progfile:å…?许awk调用并执行progfile指定有程åº?文件。progfile是一个文本文件,他必须符å?ˆawkçš„è¯æ³•。
in_file:awk的输入文件,awkå…?许对多个输入文件进行处ç?†ã€‚值得注æ„?的是awkä¸?修改输入文件。如果未指定输入文件,awk将接å?—æ ‡å‡†è¾“å…¥ï¼Œå¹¶å°†ç»“æžœæ˜¾ç¤ºåœ¨æ ‡å‡†è¾“å‡ºä¸Šã€‚awk支æŒ?输入输出é‡?定å?‘。
awk的记录ã€?å—æ®µä¸Žå†…ç½®å?˜é‡?:
å‰?é?¢è¯´è¿‡ï¼Œawk处ç?†çš„工作与数æ?®åº“的处ç?†æ–¹å¼?有相å?Œä¹‹å¤„,其相å?Œå¤„之一就是awk支æŒ?å¯¹è®°å½•å’Œå—æ®µçš„处ç?†ï¼Œå…¶ä¸å¯¹å—段的处ç?†æ˜¯grepå’Œsedä¸?能实现的,这也是awkä¼˜äºŽäºŒè€…çš„åŽŸå› ä¹‹ä¸€ã€‚åœ¨awkä¸ï¼Œç¼ºçœ?的情况下总是将文本文件ä¸çš„一行视为一个记录,而将一行ä¸çš„æŸ?一部分作为记录ä¸çš„ä¸€ä¸ªå—æ®µã€‚为了æ“?作这些ä¸?å?Œçš„å—æ®µï¼Œawk借用shell的方法,用$1,$2,$3…è¿™æ ·çš„æ–¹å¼?æ?¥é¡ºåº?地表示行(记录)ä¸çš„ä¸?å?Œå—段。特殊地,awk用$0表示整个行(记录)。ä¸?å?Œçš„å—æ®µä¹‹é—´æ˜¯ç”¨ç§°ä½œåˆ†éš”符的å—ç¬¦åˆ†éš”å¼€çš„ã€‚ç³»ç»Ÿé»˜è®¤çš„åˆ†éš”ç¬¦æ˜¯ç©ºæ ¼ã€‚awkå…?许在命令行ä¸ç”¨-F re的形å¼?æ?¥æ”¹å?˜è¿™ä¸ªåˆ†éš”符。事实上,awk用一个内置的å?˜é‡?FSæ?¥è®°å¿†è¿™ä¸ªåˆ†éš”符。awk䏿œ‰å¥½å‡ ä¸ªè¿™æ ·çš„å†…ç½®å?˜é‡?,例如,记录分隔符å?˜é‡?RSã€?当å‰?工作的记录数NRç‰ç‰ï¼Œæœ¬æ–‡å?Žé?¢çš„附表列出了全部的内置å?˜é‡?。这些内置的å?˜é‡?å?¯ä»¥åœ¨awk程åº?ä¸å¼•ç”¨æˆ–ä¿®æ”¹ï¼Œä¾‹å¦‚ï¼Œä½ å?¯ä»¥åˆ©ç”¨NRå?˜é‡?在模å¼?匹é…?䏿Œ‡å®šå·¥ä½œèŒƒå›´ï¼Œä¹Ÿå?¯ä»¥é€šè¿‡ä¿®æ”¹è®°å½•分隔符RS让一个特殊å—符而ä¸?是æ?¢è¡Œç¬¦ä½œä¸ºè®°å½•的分隔符。
例:显示文本文件myfileä¸ç¬¬ä¸ƒè¡Œåˆ°ç¬¬å??五行ä¸ä»¥å—符%åˆ†éš”çš„ç¬¬ä¸€å—æ®µï¼Œç¬¬ä¸‰å—æ®µå’Œç¬¬ä¸ƒå—æ®µï¼š
awk -F % ‘NR==7,NR==15 {printf $1 $3 $7}’
awk的内置函数
awk 之所以æˆ?为一ç§?优秀的程åº?设计è¯è¨€çš„åŽŸå› ä¹‹ä¸€æ˜¯å®ƒå?¸æ”¶äº†æŸ?些优秀的程åº?设计è¯è¨€ï¼ˆä¾‹å¦‚C)è¯è¨€çš„许多优点。这些优点之一就是内置函数的使用,awk定义并支æŒ?了一系列的内置函数,由于这些函数的使用,使得awkæ??供的功能更为完善和强大,例如,awk使用了一系列的å—符串处ç?†å†…置函数(这些函数看起æ?¥ä¸ŽC è¯è¨€çš„å—符串处ç?†å‡½æ•°ç›¸ä¼¼ï¼Œå…¶ä½¿ç”¨æ–¹å¼?与Cè¯è¨€ä¸çš„å‡½æ•°ä¹Ÿç›¸å·®æ— å‡ )ï¼Œæ£æ˜¯ç”±äºŽè¿™äº›å†…置函数的使用,使awk处ç?†å—ç¬¦ä¸²çš„åŠŸèƒ½æ›´åŠ å¼ºå¤§ã€‚æœ¬æ–‡å?Žé?¢çš„附录ä¸åˆ—有一般的awk所æ??ä¾›çš„å†…ç½®å‡½æ•°ï¼Œè¿™äº›å†…ç½®å‡½æ•°ä¹Ÿè®¸ä¸Žä½ çš„awkç‰ˆæœ¬æœ‰äº›å‡ºå…¥ï¼Œå› æ¤ï¼Œåœ¨ä½¿ç”¨ä¹‹å‰?,最好å?‚è€ƒä¸€ä¸‹ä½ çš„ç³»ç»Ÿä¸çš„è?”机帮助。
作为内置函数的一个例å?,我们将在这里介ç»?awkçš„printf函数,这个函数使得awk与cè¯è¨€çš„输出相一致。实际上,awk䏿œ‰è®¸å¤šå¼•用形å¼?都是从Cè¯è¨€å€Ÿç”¨è¿‡æ?¥çš„ã€‚å¦‚æžœä½ ç†Ÿæ‚‰Cè¯è¨€ï¼Œä½ 也许会记得其ä¸çš„printf函数,它æ??ä¾›çš„å¼ºå¤§æ ¼å¼?输出功能曾ç»?带我们许多的方便。幸è¿?的是,我们在awkä¸å?ˆå’Œå®ƒé‡?逢了。awkä¸printfå‡ ä¹Žä¸ŽCè¯è¨€ä¸ä¸€æ¨¡ä¸€æ ·ï¼Œå¦‚æžœä½ ç†Ÿæ‚‰Cè¯è¨€çš„è¯?ï¼Œä½ å®Œå…¨å?¯ä»¥ç…§Cè¯è¨€çš„æ¨¡å¼?使用awkä¸çš„printfã€‚å› æ¤åœ¨è¿™é‡Œï¼Œæˆ‘们å?ªç»™å‡ºä¸€ä¸ªä¾‹å?ï¼Œå¦‚æžœä½ ä¸?熟悉的è¯?,请éš?便找一本Cè¯è¨€çš„入门书翻翻。
例:显示文件myfileä¸çš„行å?·å’Œç¬¬3å—æ®µï¼š
$awk ‘{printf”%03d%s\n”,NR,$1}’ myfile
在命令行使用awk
按照顺åº?,我们应当讲解awk程åº?设计的内容了,但在讲解之å‰?,我们将用一些例å?æ?¥å¯¹å‰?é?¢çš„知识进行回顾,这些例å?都是在命令行ä¸ä½¿ç”¨çš„ï¼Œç”±æ¤æˆ‘们å?¯ä»¥çŸ¥é?“在命令行ä¸ä½¿ç”¨awkæ˜¯å¤šä¹ˆçš„æ–¹ä¾¿ã€‚è¿™æ ·å?šçš„åŽŸå› ä¸€æ–¹é?¢æ˜¯ä¸ºä¸‹é?¢çš„内容作铺垫,å?¦ä¸€æ–¹é?¢æ˜¯ä»‹ç»?一些解决简å?•问题的方法,我们完全没有必è¦?用å¤?æ?‚的方法æ?¥è§£å†³ç®€å?•的问题—-既然awkæ??供了较为简å?•的方法的è¯?。
例:显示文本文件mydoc匹é…?(å?«æœ‰ï¼‰å—符串”sun”的所有行。
$awk ‘/sun/{print}’ mydoc
由于显示整个记录(全行)是awk的缺çœ?åŠ¨ä½œï¼Œå› æ¤å?¯ä»¥çœ?ç•¥action项。
$awk ‘/sun/’ mydoc
例:下�是一个较为��的匹�的示例:
$awk ‘/[Ss]un/,/[Mm]oon/ {print}’ myfile
它将显示第一个匹é…?Sun或sun的行与第一个匹é…?Moon或moonçš„è¡Œä¹‹é—´çš„è¡Œï¼Œå¹¶æ˜¾ç¤ºåˆ°æ ‡å‡†è¾“å‡ºä¸Šã€‚
例:下�的示例显示了内置��和内置函数length()的使用:
$awk ‘length($0)>80 {print NR}’ myfile
该命令行将显示文本myfile䏿‰€æœ‰è¶…过80个å—符的行å?·ï¼Œåœ¨è¿™é‡Œï¼Œç”¨$0表示整个记录(行),å?Œæ—¶ï¼Œå†…ç½®å?˜é‡?NRä¸?ä½¿ç”¨æ ‡å¿—ç¬¦’$'。
例:作为一个较为实际的例å?,我们å?‡è®¾è¦?对UNIXä¸çš„用户进行安全性检查,方法是考察/etc下的passwd文件,检查其ä¸çš„passwdå—æ®µï¼ˆç¬¬äºŒå—段)是å?¦ä¸º”*”,如ä¸?为”*”,则表示该用户没有设置密ç ?,显示出这些用户å??ï¼ˆç¬¬ä¸€å—æ®µï¼‰ã€‚我们å?¯ä»¥ç”¨å¦‚下è¯å?¥å®žçŽ°ï¼š
#awk -F: ‘$2==”" {printf(“%s no password!\n”,$1′ /etc/passwd
在这个示例ä¸ï¼Œpasswdæ–‡ä»¶çš„å—æ®µåˆ†éš”符是“:â€?ï¼Œå› æ¤ï¼Œå¿…须用-F:æ?¥æ›´æ”¹é»˜è®¤çš„å—æ®µåˆ†éš”符,这个示例ä¸ä¹Ÿæ¶‰å?Šåˆ°äº†å†…置函数printf的使用。
awk的��
如å?Œå…¶å®ƒç¨‹åº?设计è¯è¨€ä¸€æ ·ï¼Œawkå…?许在程åº?è¯è¨€ä¸è®¾ç½®å?˜é‡?,事实上,æ??ä¾›å?˜é‡?的功能是程åº?设计è¯è¨€çš„其本è¦?求,ä¸?æ??ä¾›å?˜é‡?的程åº?设计è¯è¨€æœ¬äººè¿˜ä»Žæœªè§?过。
awk æ??供两ç§?å?˜é‡?,一ç§?是awk内置的å?˜é‡?,这å‰?é?¢æˆ‘们已ç»?讲过,需è¦?ç?€é‡?指出的是,与å?Žé?¢æ??到的其它å?˜é‡?ä¸?å?Œçš„æ˜¯ï¼Œåœ¨awk程åº?ä¸å¼•用内置å?˜é‡?ä¸?需è¦?ä½¿ç”¨æ ‡å¿—ç¬¦”$”(回忆一下å‰?é?¢è®²è¿‡çš„NR的使用)。awkæ??供的å?¦ä¸€ç§?å?˜é‡?是自定义å?˜é‡?。awkå…?许用户在awk程åº?è¯å?¥ä¸å®šä¹‰å¹¶è°ƒç”¨è‡ªå·²çš„å?˜é‡?。当然这ç§?å?˜é‡?ä¸?能与内置å?˜é‡?å?Šå…¶å®ƒawkä¿?ç•™å—相å?Œï¼Œåœ¨awkä¸å¼•用自定义å?˜é‡?必须在它å‰?é?¢åŠ ä¸Šæ ‡å¿—ç¬¦”$”。与Cè¯è¨€ä¸?å?Œçš„æ˜¯ï¼Œawkä¸ä¸?需è¦?对å?˜é‡?进行åˆ?始化, awkæ ¹æ?®å…¶åœ¨awkä¸ç¬¬ä¸€æ¬¡å‡ºçŽ°çš„å½¢å¼?和上下文确定其具体的数æ?®ç±»åž‹ã€‚当å?˜é‡?类型ä¸?确定时,awk默认其为å—ç¬¦ä¸²ç±»åž‹ã€‚è¿™é‡Œæœ‰ä¸€ä¸ªæŠ€å·§ï¼šå¦‚æžœä½ è¦?è®©ä½ çš„ awk程åº?知é?“ä½ æ‰€ä½¿ç”¨çš„å?˜é‡?çš„æ˜Žç¡®ç±»åž‹ï¼Œä½ åº”å½“åœ¨åœ¨ç¨‹åº?ä¸ç»™å®ƒèµ‹åˆ?值。在å?Žé?¢çš„实例ä¸ï¼Œæˆ‘们将用到这一技巧。
è¿?算与判æ–:
作为一ç§?程åº?设计è¯è¨€æ‰€åº”具有的特点之一,awk支æŒ?多ç§?è¿?算,这些è¿?算与Cè¯è¨€æ??ä¾›çš„å‡ æœ¬ç›¸å?Œï¼šå¦‚+ã€?-ã€?*ã€?/ã€?%ç‰ç‰ï¼Œå?Œæ—¶ï¼Œawk也支æŒ?Cè¯è¨€ä¸ç±»ä¼¼++ã€?–ã€?+=ã€?-=ã€?=+ã€?=-之类的功能,这给熟悉Cè¯è¨€çš„使用者编写awk程åº?带æ?¥äº†æž?大的方便。作为对è¿?算功能的一ç§?扩展,awk还æ??供了一系列内置的è¿?算函数(如logã€?sqrã€?cosã€?sinç‰ç‰ï¼‰å’Œä¸€äº›ç”¨äºŽå¯¹å—符串进行æ“?作(è¿?算)的函数(如lengthã€?substrç‰ç‰ï¼‰ã€‚这些函数的引用大大的æ??高了awkçš„è¿?算功能。
作为对æ?¡ä»¶è½¬ç§»æŒ‡ä»¤çš„ä¸€éƒ¨åˆ†ï¼Œå…³ç³»åˆ¤æ–æ˜¯æ¯?ç§?程åº?设计è¯è¨€éƒ½å…·å¤‡çš„功能,awk也ä¸?例外。 awkä¸å…?许进行多ç§?测试,如常用的==(ç‰äºŽï¼‰ã€?ï¼?=(ä¸?ç‰äºŽï¼‰ã€?>(大于)ã€?=(大于ç‰äºŽï¼‰ã€?>=(å°?于ç‰äºŽï¼‰ç‰ç‰ï¼Œå?Œæ—¶ï¼Œä½œä¸ºæ ·å¼?匹é…?,还æ??供了~(匹é…?于)和ï¼?~(ä¸?匹é…?于)判æ–。
作为对测试的一ç§?扩充,awk也支æŒ?用逻辑è¿?算符:!(é?ž)ã€?&&(与)ã€?||(或)和括å?·ï¼ˆï¼‰è¿›è¡Œå¤šé‡?判æ–,这大大增强了awk的功能。本文的附录ä¸åˆ—出了awk所å…?许的è¿?ç®—ã€?判æ–以å?Šæ“?作符的优先级。
awk的�程控制
æµ?程控制è¯å?¥æ˜¯ä»»ä½•程åº?设计è¯è¨€éƒ½ä¸?能缺少的部分。任何好的è¯è¨€éƒ½æœ‰ä¸€äº›æ‰§è¡Œæµ?程控制的è¯å?¥ã€‚awkæ??供的完备的æµ?程控制è¯å?¥ç±»ä¼¼äºŽCè¯è¨€ï¼Œè¿™ç»™æˆ‘们编程带æ?¥äº†æž?大的方便。
1�BEGIN和END:
在awk ä¸ä¸¤ä¸ªç‰¹åˆ«çš„表达å¼?,BEGINå’ŒEND,这两者都å?¯ç”¨äºŽpatternä¸ï¼ˆå?‚考å‰?é?¢çš„awkè¯æ³•),æ??ä¾›BEGINå’ŒEND的作用是给程åº?赋予åˆ?始状æ€?和在程åº?结æ?Ÿä¹‹å?Žæ‰§è¡Œä¸€äº›æ‰«å°¾çš„工作。任何在BEGIN之å?Žåˆ—出的æ“?作(在{}内)将在awk开始扫æ??输入之å‰?执行,而END之å?Žåˆ—出的æ“?作将在扫æ??完全部的输入之å?Žæ‰§è¡Œã€‚å› æ¤ï¼Œé€šå¸¸ä½¿ç”¨BEGINæ?¥æ˜¾ç¤ºå?˜é‡?和预置(åˆ?始化)å?˜é‡?,使用ENDæ?¥è¾“出最终结果。
例:累计销售文件xsä¸çš„销售金é¢?(å?‡è®¾é”€å”®é‡‘é¢?åœ¨è®°å½•çš„ç¬¬ä¸‰å—æ®µï¼‰ï¼š
$awk
>’BEGIN { FS=”:”;print “统计销售金é¢?”;total=0}
>{print $3;total=total+$3;}
>END {printf “销售金é¢?总计:%.2f”,total}’ sx
(注:>是shellæ??供的第二æ??示符,如è¦?在shell程åº?awkè¯å?¥å’Œawkè¯è¨€ä¸æ?¢è¡Œï¼Œåˆ™éœ€åœ¨è¡Œå°¾åŠ å??æ–œæ? \)
在这里,BEGIN预置了内部å?˜é‡?FSï¼ˆå—æ®µåˆ†éš”符)和自定义å?˜é‡?total,å?Œæ—¶åœ¨æ‰«æ??之å‰?显示出输出行头。而END则在扫æ??完æˆ?å?Žæ‰“å?°å‡ºæ€»å?ˆè®¡ã€‚
2ã€?æµ?程控制è¯å?¥
awkæ??供了完备的æµ?程控制è¯å?¥ï¼Œå…¶ç”¨æ³•与Cè¯è¨€ç±»ä¼¼ã€‚下é?¢æˆ‘ä»¬ä¸€ä¸€åŠ ä»¥è¯´æ˜Žï¼š
2.1ã€?if…elseè¯å?¥:
æ ¼å¼?:
if(表达�)
è¯å?¥1
else
è¯å?¥2
æ ¼å¼?且è¯å?¥1″å?¯ä»¥æ˜¯å¤šä¸ªè¯å?¥ï¼Œå¦‚æžœä½ ä¸ºäº†æ–¹ä¾¿awk判æ–ä¹Ÿæ–¹ä¾¿ä½ è‡ªå·²é˜…è¯»ï¼Œä½ æœ€å¥½å°†å¤šä¸ªè¯å?¥ç”¨{}括起æ?¥ã€‚awk分æž?结构å…?è®¸åµŒå¥—ï¼Œå…¶æ ¼å¼?为:
if(表达�1)
{if(表达�2)
è¯å?¥1
else
è¯å?¥2
}
è¯å?¥3
else {if(表达�3)
è¯å?¥4
else
è¯å?¥5
}
è¯å?¥6
当然实际æ“?作过程ä¸ä½ å?¯èƒ½ä¸?会用到如æ¤å¤?æ?‚的分æž?结构,这里å?ªæ˜¯ä¸ºäº†ç»™å‡ºå…¶æ ·å¼?罢了。
2.2ã€?whileè¯å?¥
æ ¼å¼?为:
while(表达�)
è¯å?¥
2.3ã€?do-whileè¯å?¥
æ ¼å¼?为:
do
{
è¯å?¥
}while(æ?¡ä»¶åˆ¤æ–è¯å?¥ï¼‰
2.4ã€?forè¯å?¥
æ ¼å¼?为:
for(åˆ?始表达å¼?;ç»ˆæ¢æ?¡ä»¶;æ¥é•¿è¡¨è¾¾å¼?)
{è¯å?¥}
在awk çš„ whileã€?do-whileå’Œforè¯å?¥ä¸å…?许使用break,continueè¯å?¥æ?¥æŽ§åˆ¶æµ?程走å?‘,也å…?许使用exitè¿™æ ·çš„è¯å?¥æ?¥é€€å‡ºã€‚break 䏿–当å‰?æ£åœ¨æ‰§è¡Œçš„循环并跳到循环外执行下一æ?¡è¯å?¥ã€‚continue从当å‰?ä½?置跳到循环开始处执行。对于exit的执行有两ç§?情况:当exitè¯å?¥ä¸?在 END䏿—¶ï¼Œä»»ä½•æ“?作ä¸çš„exit命令表现得如å?Œåˆ°äº†æ–‡ä»¶å°¾ï¼Œæ‰€æœ‰æ¨¡å¼?或æ“?作执行将å?œæ¢ï¼ŒEND模å¼?ä¸çš„æ“?作被执行。而出现在ENDä¸çš„exit将导致程åº?终æ¢ã€‚
例:为了
awkä¸çš„自定义函数
å®šä¹‰å’Œè°ƒç”¨ç”¨æˆ·è‡ªå·±çš„å‡½æ•°æ˜¯å‡ ä¹Žæ¯?个高级è¯è¨€éƒ½å…·æœ‰çš„功能,awk也ä¸?例外,但原始的awkå¹¶ä¸?æ??供函数功能,å?ªæœ‰åœ¨nawk或较新的awkç‰ˆæœ¬ä¸æ‰?å?¯ä»¥å¢žåŠ å‡½æ•°ã€‚
函数的使用包å?«ä¸¤éƒ¨åˆ†ï¼šå‡½æ•°çš„定义与函数调用。其ä¸å‡½æ•°å®šä¹‰å?ˆåŒ…括è¦?执行的代ç ?(函数本身)和从主程åº?代ç ?ä¼ é€’åˆ°è¯¥å‡½æ•°çš„ä¸´æ—¶è°ƒç”¨ã€‚
awk函数的定义方法如下:
function 函数å??(å?‚数表){
函数体
}
在gawkä¸å…?许将functionçœ?略为func,但其它版本的awkä¸?å…?许。函数å??必须是一个å?ˆæ³•çš„æ ‡å¿—ç¬¦ï¼Œå?‚数表ä¸å?¯ä»¥ä¸?æ??ä¾›å?‚数(但在调用函数时函数å??å?Žçš„一对括å?·ä»?然是ä¸?å?¯ç¼ºå°‘的),也å?¯ä»¥æ??供一个或多个å?‚数。与Cè¯è¨€ç›¸ä¼¼ï¼Œawkçš„å?‚数也是通过值æ?¥ä¼ 递的。
在awk ä¸è°ƒç”¨å‡½æ•°æ¯”较简å?•,其方法与Cè¯è¨€ç›¸ä¼¼ï¼Œä½†awk比Cè¯è¨€æ›´ä¸ºç?µæ´»ï¼Œå®ƒä¸?执行å?‚数有效性检查。æ?¢å?¥è¯?è¯´ï¼Œåœ¨ä½ è°ƒç”¨å‡½æ•°æ—¶ï¼Œå?¯ä»¥åˆ—出比函数预计(函数定义ä¸è§„定)的多或少的å?‚数,多余的å?‚数会被awk所忽略,而ä¸?足的å?‚数,awk将它们置为缺çœ?值0或空å—符串,具体置为何值,将å?–决于å?‚数的使用方å¼?。
awk函数有两ç§?返回方å¼?:éš?å¼?返回和显å¼?返回。当awk执行到函数的结尾时,它自动地返回到调用程åº?,这是函数是éš?å¼?返回的。如果需è¦?在结æ?Ÿä¹‹å‰?退出函数,å?¯ä»¥æ˜Žç¡®åœ°ä½¿ç”¨è¿”回è¯å?¥æ??å‰?退出。方法是在函数ä¸ä½¿ç”¨å½¢å¦‚:return 返回值 æ ¼å¼?çš„è¯å?¥ã€‚
例:下é?¢çš„例å?演示了函数的使用。在这个示例ä¸ï¼Œå®šä¹‰äº†ä¸€ä¸ªå??为print_header的函数,该函数调用了两个å?‚æ•°FileNameå’ŒPageNum, FileNameå?‚æ•°ä¼ ç»™å‡½æ•°å½“å‰?使用的文件å??,PageNumå?‚数是当å‰?页的页å?·ã€‚这个函数的功能是打å?°ï¼ˆæ˜¾ç¤ºï¼‰å‡ºå½“å‰?文件的文件å??,和当å‰?页的页å?·ã€‚完æˆ?这个功能å?Žï¼Œè¿™ä¸ªå‡½æ•°å°†è¿”回下一页的页å?·ã€‚
nawk
>’BEGIN{pageno=1;file=FILENAME
>pageno=print_header(file,pageno);#调用函数print_header
>printf(“当å‰?页页å?·æ˜¯ï¼š%d\n”,pageno);
>}
>#定义函数print_header
>function print_header(FileName,PageNum){
>printf(“%s %d\n”,FileName,PageNum); >PageNum++;return PageNUm;
>}
>}’ myfile
执行这个程�将显示如下内容:
myfile 1
当�页页�是:2
awk高级输入输出
1.读�下一�记录:
awkçš„nextè¯å?¥å¯¼è‡´awk读å?–下一个记录并完æˆ?模å¼?匹é…?,然å?Žç«‹å?³æ‰§è¡Œç›¸åº”çš„æ“?作。通常它用匹é…?的模å¼?执行æ“?作ä¸çš„代ç ?。next导致这个记录的任何é¢?外匹é…?模å¼?被忽略。
2.简�地读�一�记录
awk çš„ getlineè¯å?¥ç”¨äºŽç®€å?•地读å?–一æ?¡è®°å½•。如果用户有一个数æ?®è®°å½•类似两个物ç?†è®°å½•,那么getline将尤其有用。它完æˆ?ä¸€èˆ¬å—æ®µçš„分离(è®¾ç½®å—æ®µå?˜é‡?$0 FNR NF NR)。如果æˆ?功则返回1,失败则返回0(到达文件尾)。如果需简å?•地读å?–一个文件,则å?¯ä»¥ç¼–写以下代ç ?:
例:示例getline的使用
{while(getline==1)
{
#process the inputted fields
}
}
也å?¯ä»¥ä½¿getlineä¿?å˜è¾“入数æ?®åœ¨ä¸€ä¸ªå—段ä¸ï¼Œè€Œä¸?是通过使用getline variable的形å¼?处ç?†ä¸€èˆ¬å—段。当使用这ç§?æ–¹å¼?时,NF被置æˆ?0,FNRå’ŒNR被增值。
用户也å?¯ä»¥ä½¿ç”¨getline”datafile”
或
printf(“hello word!\n”)>>”datafile”
5.输出到一个命令
awkä¸å…?许用如下方å¼?将结果输出到一个命令:
printf(“hello word!\n”)|”sort-t’,'”
awk与shell script混�编程
å› ä¸ºawkå?¯ä»¥ä½œä¸ºä¸€ä¸ªshellå‘½ä»¤ä½¿ç”¨ï¼Œå› æ¤awk能与shell批处ç?†ç¨‹åº?很好的èž?å?ˆåœ¨ä¸€èµ·ï¼Œè¿™ç»™å®žçްawk与shell程åº?的混å?ˆç¼–程æ??供了å?¯èƒ½ã€‚实现混å?ˆç¼–程的关键是awk与shell script之间的对è¯?,æ?¢è¨€ä¹‹ï¼Œå°±æ˜¯awk与shell script之间的信æ?¯äº¤æµ?:awk从shell scriptä¸èŽ·å?–所需的信æ?¯ï¼ˆé€šå¸¸æ˜¯å?˜é‡?的值)ã€?在awk䏿‰§è¡Œshell命令行ã€?shell script将命令执行的结果é€?ç»™awk处ç?†ä»¥å?Šshell script读å?–awk的执行结果ç‰ç‰ã€‚
1.awk读�Shell script程���
在awk䏿ˆ‘们å?¯ä»¥é€šè¿‡â€œ’$å?˜é‡?å??’â€?的方å¼?读å?–sell scrpit程åº?ä¸çš„å?˜é‡?。
例:在下é?¢çš„示例ä¸ï¼Œæˆ‘们将读å?–sell scrpit程åº?ä¸çš„å?˜é‡?Name,该å?˜é‡?å˜æ”¾çš„æ˜¯æ–‡æœ¬myfile的撰写者,awk将打å?°å‡ºè¿™ä¸ªäººå??。
$cat writename
:
# @(#)
#
.
.
.
Name=”å¼ ä¸‰” nawk ‘BEGIN {name=”‘Name’”;\ printf(“\t%s\t撰写者%s\n”,FILENAME,name”);}\
{…}END{…}’ myfile
.
.
.
2.将shell命令的执行结果�给awk处�
作为信æ?¯ä¼ é€?的一ç§?方法,我们å?¯ä»¥å°†ä¸€æ?¡shell命令的结果通过管é?“线(|ï¼‰ä¼ é€’ç»™awk处ç?†ï¼š
例:示例awk处�shell命令的执行结果
$who -u | awk ‘{printf(“%sæ£åœ¨æ‰§è¡Œ%s\n”,$2,$1)}’
该命令将打å?°å‡ºæ³¨å†Œç»ˆç«¯æ£åœ¨æ‰§è¡Œçš„程åº?å??。
3.shell script程�读awk的执行结果
为了实现shell script程åº?读å?–awk执行的结果,我们å?¯ä»¥é‡‡å?–一些特殊的方法,例如我们å?¯ä»¥ç”¨å?˜é‡?å??=`awkè¯å?¥`的形å¼?å°†awkæ‰§è¡Œçš„ç»“æžœå˜æ”¾å…¥ä¸€ä¸ª shell scriptå?˜é‡?。当然也å?¯ä»¥ç”¨ç®¡é?“线的方法将awkæ‰§è¡Œç»“æžœä¼ é€’ç»™shell script程åº?处ç?†ã€‚
ä¾‹ï¼šä½œä¸ºä¼ é€?消æ?¯çš„æœºåˆ¶ä¹‹ä¸€ï¼ŒUNIXæ??供了一个å?‘å…¶æ‰€æœ‰ç”¨æˆ·ä¼ é€?消æ?¯çš„命令wall(æ„?æ€?是write to all写给所有用户),该命令å…?许å?‘所有工作ä¸çš„用户(终端)å?‘é€?消æ?¯ã€‚为æ¤ï¼Œæˆ‘们å?¯ä»¥é€šè¿‡ä¸€æ®µshell批处ç?†ç¨‹åº?wall.shellæ?¥æ¨¡æ‹Ÿè¿™ä¸€ç¨‹åº?(事实上比较è€?的版本ä¸wall就是一段shell批处ç?†ç¨‹åº?:
$cat wall.shell
:
# @(#) wall.shell:��消�给�个已注册终端
#
cat >/tmp/$$
#用户录入消æ?¯æ–‡æœ¬ who -u | awk ‘{print $2}’ | while read tty
do
cat /tmp/$$>$tty
done
在这个程åº?里,awk接å?—who -u命令的执行结果,该命令打å?°å‡ºæ‰€æœ‰å·²æ³¨å†Œç»ˆç«¯çš„ä¿¡æ?¯ï¼Œå…¶ä¸ç¬¬äºŒä¸ªå—段是已注册终端的设备å??ï¼Œå› æ¤ç”¨awk命令æž?出该设备å??,然å?Žç”¨while read ttyè¯å?¥å¾ªçŽ¯è¯»å‡ºè¿™äº›æ–‡ä»¶å??到å?˜é‡?(shell scriptå?˜é‡?)ttyä¸ï¼Œä½œä¸ºä¿¡æ?¯ä¼ é€?的终结地å?€ã€‚
4.在awk䏿‰§è¡Œshell命令行—-嵌入函数system()
system()是一个ä¸?适å?ˆå—符或数å—类型的嵌入函数,该函数的功能是处ç?†ä½œä¸ºå?‚æ•°ä¼ é€’ç»™å®ƒçš„å—符串。system对这个å?‚数的处ç?†å°±æ˜¯å°†å…¶ä½œä¸ºå‘½ä»¤å¤„ç?†ï¼Œä¹Ÿå°±æ˜¯è¯´å°†å…¶å½“ä½œå‘½ä»¤è¡Œä¸€æ ·åŠ ä»¥æ‰§è¡Œã€‚è¿™ä½¿å¾—ç”¨æˆ·åœ¨è‡ªå·±çš„awk程åº?需è¦?æ—¶å?¯ä»¥ç?µæ´»åœ°æ‰§è¡Œå‘½ä»¤æˆ–脚本。
例:下é?¢çš„程åº?将使用system嵌入函数打å?°ç”¨æˆ·ç¼–åˆ¶å¥½çš„æŠ¥è¡¨æ–‡ä»¶ï¼Œè¿™ä¸ªæ–‡ä»¶å˜æ”¾åœ¨å??为myreport.txt的文件ä¸ã€‚为简约起è§?,我们å?ªåˆ—出了其END部分:
.
.
.
END {close(“myreport.txt”);system(“lp myreport.txt”);}
在这个示例ä¸ï¼Œæˆ‘们首先使用closeè¯å?¥å…³é—了文件myreport.txt文件,然å?Žä½¿ç”¨system嵌入函数将myreport.txté€?入打å?°æœºæ‰“å?°ã€‚
写到这里,我ä¸?å¾—ä¸?跟朋å?‹ä»¬è¯´å†?è§?了,实在地说,这些内容ä»?然是awkçš„åˆ?æ¥çŸ¥è¯†ï¼Œç”µè„‘永远是å‰?进的科å¦ï¼Œawk也ä¸?例外,本篇所能å?šçš„å?ªæ˜¯åœ¨ä½ å‰?行的漫漫长途ä¸é“ºå¹³ä¸€æ®µå°?å°?开端,剩下的路还得é? ä½ è‡ªå·±åŽ»èµ°ã€‚è€?å®žè¯´ï¼Œå¦‚æžœæœ¬æ–‡çœŸèƒ½ç»™ä½ å‰?行的路上带æ?¥äº›è®¸çš„æ–¹ä¾¿ï¼Œé‚£æœ¬äººå°±çŸ¥è¶³äº†ï¼?
如对本篇有任何疑问,请E-mail To:Chizlong@yeah.net或到主页http://chizling.yeah.netä¸ç•™è¨€ã€‚
附录:
1.awk的常规表达å¼?å…ƒå—符
\ æ?¢ç ?åº?列
^ 在å—符串的开头开始匹é…?
$ 在å—符串的结尾开始匹é…?
. 与任何å?•个å—符串匹é…?
[ABC] 与[]内的任一å—符匹é…?
[A-Ca-c] 与A-Cå?Ša-c范围内的å—符匹é…?ï¼ˆæŒ‰å—æ¯?表顺åº?)
[^ABC] 与除[]内的所有å—符以外的任一å—符匹é…?
Desk|Chair 与Deskå’ŒChairä¸çš„任一个匹é…?
[ABC][DEF] å…³è?”。与Aã€?Bã€?Cä¸çš„任一å—符匹é…?,且其å?Žè¦?è·ŸDã€?Eã€?Fä¸çš„任一个å—符。
* 与Aã€?B或Cä¸ä»»ä¸€ä¸ªå‡ºçް0次或多次的å—符相匹é…?
+ 与Aã€?B或Cä¸ä»»ä½•一个出现1次或多次的å—符相匹é…?
? 与一个空串或Aã€?B或C在任何一个å—符相匹é…?
(Blue|Black)berry �并常规表达�,与Blueberry或Blackberry相匹�
2.awk算术�算符
�算符 用途
——————
x^y x的y次幂
x**y �上
x%y 计算x/y的余数(求模)
x+y xåŠ y
x-y x�y
x*y x乘y
x/y x除y
-y 负y(y的开关符�);也称一目�
++y yåŠ 1å?Žä½¿ç”¨y(å‰?ç½®åŠ ï¼‰
y++ 使用y值å?ŽåŠ 1(å?Žç¼€åŠ ï¼‰
–y yå‡?1å?Žä½¿ç”¨y(å‰?ç½®å‡?)
y– 使用å?Žyå‡?1(å?Žç¼€å‡?)
x=y 将y的值赋给x
x+=y 将x+y的值赋给x
x-=y 将x-y的值赋给x
x*=y 将x*y的值赋给x
x/=y 将x/y的值赋给x x%=y 将x%y的值赋给x
x^=y 将x^y的值赋给x
x**=y 将x**y的值赋给x
3.awk�许的测试:
�作符 �义
x==y xç‰äºŽy
x!=y xä¸?ç‰äºŽy
x>y x大于y
x>=y x大于或ç‰äºŽy
x >=
- texas hold em five card poker rules trackbacked on 2 years, 5 months ago
- texas term life insurance trackbacked on 2 years, 5 months ago
- casino pagamento immediato trackbacked on 2 years ago
- travel insurance quote uk trackbacked on 1 year, 9 months ago
- gambling tramadol phentermine carisoprodol casino trackbacked on 1 year, 8 months ago
- nerladdning texas hold em trackbacked on 1 year, 3 months ago
- online texas holdem tournaments trackbacked on 1 year, 3 months ago
- vegasredcasino trackbacked on 1 year ago
- instruccion juego dado trackbacked on 1 year ago