免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2245 | 回复: 1
打印 上一主题 下一主题

[SCO UNIX] awk用法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-11 13:40 |只看该作者 |倒序浏览
请教awk的详细用法,大家帮忙!!!谢谢

论坛徽章:
0
2 [报告]
发表于 2004-05-11 19:06 |只看该作者

awk用法

转贴

第一章    前言
第二章    简介
第三章    读取输入档案
第四章    印出
第五章    Patterns
第六章    算式(Expression)作为Actions的叙述
第七章    Actions里面的控制叙述
第八章    内建函式(Built-in Functions)
第九章    使用者定义的函式
第十章    □例
第十一章  结论



=======================================

第一章  前言

   awk 是一个程式语言,对於资料的处理具有很强的功能。对於文
字档里的资料做修改、比对、抽取等的处理,awk 能够以很短的程式
轻易地完成。如果使用 C 或 Pascal 等语言写程式完成上述的动作,
会不方便且很花费时间,所写的程式也会很大。

   awk 能够依照使用者的定义格式来分解输入资料,也可依照使用
者定义的格式来印出资料。

   awk 名称的由来是由它的原始设计者的姓氏之第一个字母而命名
:Alfred V. Aho, Peter J. Weinberger, Brian W. Kernighan。
awk最初在1977年完成。一个新版本的awk在1985年被发表,它的功能
比旧版本增强不少。

   gawk 是GNU所做的 awk,gawk 最初在1986年完成,之後不断地
被改进、更新。gawk 包含 awk 的所有功能。

   往後的 gawk 将以下面的2个输入档案来做例子说明。

档案'BBS-list':
aardvark     555-5553     1200/300           B
alpo-net     555-3412     2400/1200/300      A
barfly       555-7685     1200/300           A
bites        555-1675     2400/1200/300      A
camelot      555-0542     300                C
core         555-2912     1200/300           C
fooey        555-1234     2400/1200/300      B
foot         555-6699     1200/300           B
macfoo       555-6480     1200/300           A
sdace        555-3430     2400/1200/300      A
sabafoo      555-2127     1200/300           C


档案'shipped':
Jan  13  25  15 115
Feb  15  32  24 226
Mar  15  24  34 228
Apr  31  52  63 420
May  16  34  29 208
Jun  31  42  75 492
Jul  24  34  67 436
Aug  15  34  47 316
Sep  13  55  37 277
Oct  29  54  68 525
Nov  20  87  82 577
Dec  17  35  61 401

Jan  21  36  64 620
Feb  26  58  80 652
Mar  24  75  70 495
Apr  21  70  74 514



第二章  简介

   gawk 的主要功能是针对档案的每一行(line)搜寻指定的 patterns
。当一行里有符合指定的 patterns,gawk 就会在此一行执行被指定
的 actions。 gawk 依此方式处理输入档案的每一行直到输入档案结
束。

   gawk 程式是由很多的 pattern 与 action 所组成,action 写在
大括号 { } 里面,一个pattern後面就跟著一个action。整个 gawk 程
式会像下面的样子:

           pattern      {action}
           pattern      {action}

   在 gawk 程式里面的规则,pattern 或 action 能够被省略,但
是两个不能同时被省略。如果 pattern 被省略,对於输入档里面的
每一行,action 都会被执行。如果 action 被省略,内定的 action
则会印出所有符合 pattern 的输入行。



2.1 如何执行gawk程式

   基本上,有2个方法可以执行gawk程式。

   □如果 gawk 程式很短,则 gawk 可以直接写在 command line,如下所示:

         gawk 'program' input-file1 input-file2 ...

     其中 program 包括一些 pattern 和 action。

   □如果 gawk 程式较长,较为方便的做法是将 gawk 程式存在一个档案,
     即 patterns 与 actions 写在档名为 program-file 的档案里面,执行
     gawk 的格式如下所示:

         gawk -f program-file input-file1 input-file2 ...

     gawk 程式的档案不止一个时,执行gawk 的格式如下所示:

         gawk -f program-file1 -f program-file2 ... input-file1
              input-file2 ...



2.2 一个简单的例子

   现在我们举一个简单的例子,因为 gawk 程式很短,所以将 gawk 程
式直接写在 command line。

   gawk '/foo/ {print $0}' BBS-list

实际的 gawk 程式为 /foo/ {print $0}。/foo/ 为 pattern,意思为搜
寻输入档里的每一行是否含有子字串 'foo',如果含有 'foo' 则执行 action。
action 为 print $0,是将现在这一行的内容印出。BBS-list 是输入的档案。

   执行完上述指令後,会印出下面的结果:
fooey        555-1234     2400/1200/300      B
foot         555-6699     1200/300           B
macfoo       555-6480     1200/300           A
sabafoo      555-2127     1200/300           C



2.3 一个较复杂的例子

       gawk '$1 == "Feb" {sum=$2+$3}  END {print sum}'  shipped

   现在这个例子会将输入档 'shipped' 的第一个栏位与 "Feb" 做比较
,如果相等,则其对应的第2栏位与第3栏位的值会被加到变数 sum。
对於输入档的每一行重复上述的动作,直到输入档的每一行都被处理
过为止。最後将 sum 的值印出。END {print sum} 的意思为在所有的输
入读完之後,执行一次 print sum 的动作,也就是把 sum 的值印出。

   下面是执行的结果:
84

                                                            
第三章  读取输入档案                                          
                                                               
   gawk的输入可以从标准输入或指定的档案里读取。输入的读取单      
位被称为”记录”(records),gawk 在做处理时,是一个记录一个记                                                                    (p9 of 46)
录地处理。每个记录的内定值是一行(line),一个记录又被分为多个   
栏位(fields)。                                                                 
                                                                 
                                                                       
                                                               
3.1 如何将输入分解成记录(records)                              
                                                              
   gawk 语言会把输入分解成记录(record)。记录与记录之间是以            
record separator 隔开,record separator 的内定值是表示新一行的  
字元(newline character),因此内定的 record separator 使得文字            
的每一行是一个记录。                                                   
                                                                     
   record separator 随著内建变数 RS 的改变而改变。RS 是一个字串,
它的内定值是"\n"。仅有 RS 的第一个字元是有效的,它被当作 record
separator,而 RS 的其它字元会被忽略。                        
                                                            
   内建变数 FNR 会储存目前的输入档案已颈欢寥〉募锹贾?鍪?D  
建变数 NR 会储存目前为止所有的输入档案已颈欢寥〉募锹贾?鍪?     
                                                            
3.2 栏位(field)                                                              
                                                                 
   gawk 会自动将每个记录分解成多个栏位 (field)。类似於字在一           
行里面,gawk 的内定动作会认为栏位之间是以 whitespace 分开。在   
gawk 里,whitespace 的意思是一个或多个空白或 tabs。              
                                                              
   在 gawk 程式里面,以'$1'表示第一个栏位,'$2'表示第二个栏位         
,依此类推。举个例子,假设输入的一行如下所示:                  
                                                                        
       This seems like a pretty nice example.                        
                                                                     
第一个栏位或 $1 是'This',第二个栏位或 $2 是 'seems',依此类推。   
有个地方值得特别注意,第七个栏位或 $7 是'example.'而非'example'。
                                                            
   不论有多少栏位,$NF 可用来表示一个记录的最後一个栏位。以
上面的例子为例,$NF 与 $7 相同,也就是'example.'。            
                                                               
   NF 是一个内建变数,它的值表示目前这个记录之栏位的个数。  $0,看起来好像是第零个栏位,它是一个特例,它表示整个记录。
                                                                              
   下面是一个较复杂的例子:                                      
                                                                       
       gawk '$1~/foo/ {print $0}' BBS-list                     
                                                               
   结果如下:                                                
fooey        555-1234     2400/1200/300      B                        
foot         555-6699     1200/300           B                  
macfoo       555-6480     1200/300           A                           
sabafoo      555-2127     1200/300           C                        
                                                                     
这个例子是把输入档'BBS-list'的每个记录的第一个栏位作检查,如      
果它含有子字串'foo',则这一个记录会被印出。                       
                                                            
                                                            
                                                              
3.3 如何将记录分解成栏位                                       
                                                                  
   gawk 根据 field separator 将一个记录分解成栏位。field sepa- rator 以内建变数 FS 表示。                                    
                                                                              
   举个例子,假如 field separator 是'oo',则下面的行:           
                                                                       
       moo goo gai pan                                          
                                                               
会被分成三个栏位:'m'、' g'、' gai pan'。                     
                                                                     
   在 gawk 程式里,可以使用'='来改变 FS 的值。例如:            
                                                                        
       gawk 'BEGIN {FS=","}; {print $2}'                              
                                                                     
输入行如下:                                                      
                                                                 
       John Q. Smith, 29 Oak St., Walamazoo, MI 42139      
                                                            
执行gawk的结果将印出字串 ' 29 Oak St.'。BEGIN 後面的 action 会在
第一个记录被读取之前执行一次。                                                                                      
第四章  印出                                                                  
                                                                 
   在gawk程式里,actions 最常做的事就是印出(printing)。简单            
的印出,使用 printe叙述。复杂格式的印出,使用 printf 叙述。      
                                                               
                                                              
                                                                     
4.1 print叙述                                                
                                                                        
   print 叙述用在简单、标准的输出格式。叙述的格式如下所示:           
                                                                     
       print item1, item2, ...                                    
                                                                 
输出时,各个 item 之间会以一个空白分开,最後会换行(newline)。
                                                            
   如果 'print'叙述之後没有跟著任何东西,它与'print $0'的效     
果一样,它会印出现在的记录(record)。要印出空白行可使用'print     
""'。 印出一段固定的文字,可用双引号将文字的两边括起来,例如      
'print "Hello there"'。                          
这里是一个例子,它会把每个输入记录的前二个栏位印出:                       
                                                                 
       gawk '{print $1,$2}' shipped                                    
                                                               
   结果如下所示:                                               
Jan 13                                                         
Feb 15                                                                 
Mar 15                                                         
Apr 31                                                                    
May 16                                                                 
Jun 31                                                               
Jul 24                                                            
Aug 15                                                            
Sep 13                                                        
Oct 29                                                      
Nov 20                                                           
Dec 17                                                           
                                             
Feb 26                                                         
Mar 24                                                                        
Apr 21                                                            
                                                                       
                                                               
                                                               
4.2 Output Separators                                       
                                                                     
   前面我们已提过如果 print 叙述包含有多个 item,item 之间     
用逗点分开,则印出时各个item会被一个空白隔开。你能够使用任何              
的字串作为 output field separator,可以居赡诮ū涫?nbsp;OFS 的设            
定来更改 output field separator。OFS 的初始值为" ",即一格的         
空白。                                                            
                                                                 
   整个 print 叙述的输出被称为 output record。print 叙述输   
出 output record 之後,会接著输出一个字串,此字串称为 output
record separator。内建变数 ORS 用来指明此字串。ORS 的初始值      
为 "\n",也就是换行。                                            
                                                                  
   下面这个例子会印出每个记录的第一个栏位和第二个栏位,此二   
                                                                  (p16 of 46)
个栏位之间以分号';'分开,每行输出之後会加入一个空白行。        
                                                                              
       gawk 'BEGIN {OFS=";"; ORS="\n\n"} {print $1, $2}' BBS-list
                                                                       
   结果如下所示:                                               
aardvark;555-5553                                                
                                                              
alpo-net;555-3412                                                      
                                                               
barfly;555-7685                                                           
                                                                     
bites;555-1675                                                        
                                                                  
camelot;555-0542                                                  
                                                            
core;555-2912                                                
                                                               
fooey;555-1234                                                   
                                                                  
foot;555-6699                     
                                                            
macfoo;555-6480                                                              
                                                                  
sdace;555-3430                                                         
                                                               
sabafoo;555-2127                                                
                                                              
                                                                     
                                                               
                                                                        
4.3 printf叙述                                                      
                                                                     
   printf 叙述会使得输出格式较容易精确地控制。printf 叙述可以     
指定每个 item 印出的宽度,也可以指定数字的各种型式。              
                                                            
   printf 叙述的格式如下:                                 
                                                               
       printf format, item1, item2, ...                        
                                                                  
   print 与 printf 的差别是在於 format, printf 的引数比 print   
                                                                  (p18 of  
多了字串 format。format 的型式与 ANSI C 的 printf 之格式相同。
                                                                           
   printf 并不会做自动换行的动作。内建变数 OFS 与 ORS 对 printf 叙
述没有任何影响。                                                        
                                                               
   格式的指定以字元'%'开始,後面接著格式控制字母。              
                                                              
   格式控制字母如下所示:                                             
                                                               
'c' 将数字以 ASCII 字元印出。                                             
   例如'printf "%C",65'会印出字元'A'。                                
                                                                     
'd' 印出十进位的整数。                                             
                                                                 
'i' 印出十进位的整数。                                       
                                                            
'e' 将数字以科学符号的形式印出。                                 
   例如                                                         
                                                                  
     print "$4.3e",1950                    
                                                                  (p19 of  
                                                              
   结果会印出'1.950e+03'。                                                  
                                                                  
'f' 将数字以浮点的形式印出。                                            
                                                               
'g' 将数字以科学符号的形式或浮点的形式印出。数字的绝对值如果     
   大於等於0.0001则以浮点的形式印出,否则以科学符号的形式印   
   出。                                                               
                                                               
'o' 印出无号的八进位整数。                                                
                                                                     
's' 印出一个字串。                                                   
                                                                  
'x' 印出无号的十六进位整数。10至15以'a'至'f'表示。               
                                                            
'X' 印出无号的十六进位整数。10至15以'A'至'F"表示。           
                                                               
'%' 它并不是真正的格式控制字母,'%%"将印出"%'。                  
                                                                  
   在 % 与格式控制字母之间可加入 modifier,modifier 是用来进一
步控制输出的格式。可能的 modifier 如下所示:                  
                                                                           
'-'     使用在 width 之前,指明是向左靠齐。如果'-'没有出现,则会在  
       被指定的宽度向右靠齐。例如:                                    
                                                               
           printf "%-4S", "foo"                                 
                                                              
       会印出'foo '。                                                
                                                               
'width' 这一个数字指示相对应的栏位印出时的宽度。例如:                    
                                                                     
           printf "%4s","foo"                                       
                                                                  
       会印出' foo'。                                            
                                                            
       width 的值是一个最小宽度而非最大宽度。如果一个 item 的
       值需要的宽度比 width 大,则不受 width 的影响。例如      
                                                               
           printf "%4s","foobar"                    
   将印出'foobar'。                                       
                                                                           
'.prec' 此数字指定印出时的精确度。它指定小数点右边的位数。如        
       果是要印出一个字串,它指定此字串最多会被印出多少个字            
       元。                                                     
                                                               
                                                              
                                                                     
第五章  patterns                                                
                                                                        
   在 gawk 程式里面,当 pattern 符合现在的输入记录(record),其        
相对应的 action 才会被执行。                                          
                                                                  
                                                                 
                                                            
5.1 Pattern的种类                                            
                                                               
   这里对 gawk 的各种 pattern 型式作一整理:                    
                                                                  
/regular expression/                                    
                                                                 (p22 of  
   一个 regular expression 当作一个 pattern。每当输入记录 (   
   record)含有 regular expression 就视为符合。                              
                                                                  
expression                                                              
   一个单一的 expression。当一个值不为 0 或一个字串不是空的,   
   则可视为符合。                                               
                                                              
pat1,pat2                                                              
   一对的 patterns 以逗号分开,指定记录的□围。               
                                                                        
BEGIN                                                                  
END                                                                  
   这是特别的 pattern, gawk 在开始执行或要结束时会分别执行相      
   对应於BEGIN或END的 action。                                   
                                                            
null                                                           
   这是一个空的pattern,对於每个输入记录皆视为符合pattern。     
                                                      
                                                                  (p23 of  
5.2 Regular Expressions当作Patterns                          
                                                                           
   一个 regular expression 可简写为 regexp,是一种描述字串的方     
法。一个 regular expression 以斜线('/')包围当作 gawk 的 pattern。      
                                                               
   如果输入记录含有 regexp 就视为符合。例如:pattern 为 /foo/,
对於任何输入记录含有'foo'则视为符合。                          
                                                                     
   下面的例子会将含有'foo'的输入记录之第2个栏位印出。         
                                                                        
       gawk '/foo/ {print $2}' BBS-list                              
                                                                     
   结果如下:                                                     
555-1234                                                         
555-6699                                                      
555-6480                                                      
555-2127                                                         
                                                               
   regexp 也能使用在比较的算式。                                 
                                            
                                                                  (p24 of  
exp ~ /regexp/                                                
   如果 exp 符合 regexp,则结果为真(true)。                                 
                                                                  
exp !~ /regexp/                                                         
   如果 exp 不符合 regexp,则结果为真。                        
                                                               
                                                              
                                                                     
5.3 比较的算式当作Patterns                                    
                                                                        
   比较的 pattern 用来测试两个数字或字串的关系诸如大於、等於         
、小於。下面列出一些比较的pattern:                                   
                                                                  
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   如果 x 符合 regular expression y,则结果为真。
                                                                 (p25 of  
x!~y  如果 x 不符合 regular expression y,则结果为真。         
                                                                           
   上面所提到的 x 与 y,如果二者皆是数字则视为数字之间的比较,     
否则它们会被转换成字串且以字串的形式做比较。两个字串的比较,            
会先比较第一个字元,然後比较第二个字元,依此类推,直到有不同     
的地方出现为止。如果两个字串在较短的一个结束之前是相等,则视     
为长的字串比短的字串大。例如 "10" 比 "9" 小,"abc" 比 "abcd" 小。
                                                                     
                                                               
                                                                        
5.4 使用布林运算的Patterns                                          
                                                                     
   一个布林(boolean) pattern 是使用布林运算"或"('||'),"及"      
('&&'),"反"('!')来组合其它的pattern。                           
例如:                                                        
                                                              
   gawk '/2400/ && /foo/' BBS-list                              
   gawk '/2400/ || /foo/' BBS-list                              
   gawk '! /foo/' BBS-list                              
                                                            
                                                                           
第六章  算式(Expression)作为Actions的叙述                           
                                                                       
   算式(Expression) 是gawk程式里面action的基本构成者。         
                                                               
                                                                 
                                                                     
6.1 算术运算                                                  
                                                                        
   gawk 里的算术运算如下所示:                                       
                                                                     
x+y  加                                                            
x-y  减                                                           
-x   负                                                      
+x   正。实际上没有任何影响。                                 
x*y  乘                                                         
x/y  除                                                         
x%y  求馀数。例如 5%3=2。                                          
x^y                                       
x**y x 的 y 次方。例如2^3=8。                                 
                                                                           
                                                                  
                                                                       
6.2 比较算式与布林算式                                         
                                                               
   比较算式 (comparison expression) 用来比较字串或数字的关系     
,运算符号与 C 语言相同。表列如下:                                    
                                                               
x<y                                                                       
x<=y                                                                  
x>;y                                                                  
x>;=y                                                               
x==y                                                              
x!=y                                                         
x~y                                                            
x!~y                                                            
                                                               
比较的结果为真(true)则其值是 1。否则其值是 0。     
  布林算式(boolean expression)有下面三种:                  
                                                                           
boolean1 && boolean2                                                
boolean1 || boolean2                                                   
! boolean                                                        
                                                               
                                                                 
                                                                     
6.3 条件算式(Conditional Expressions)                        
                                                                        
   一个条件式算式是一种特别的算式,它含有3个运算元。                  
   条件式算式与C语言的相同:                                         
                                                                  
       selector ? if-true-exp : if-false-exp                     
                                                            
它有3个子算式。第一个子算式selector 首先会被计算。如果是真,   
则if-true-exp会被计算且它的值变成整个算式的值。否则if-false-     
exp 会被计算且它的值变成整个算式的值。                           
                                                                  
   例如下面的例子会产生x的绝对值:            
  x>;0 ? x : -x                                                         
                                                                  
                                                                       
                                                               
第七章  Actions里面的控制叙述                                    
                                                                 
   在 gawk 程式里面,控制叙述诸如 if、while 等控制程式执行的流        
程。在 gawk 里的控制叙述与 C 的类似。                           
                                                                        
   很多的控制叙述会包括其它的叙述,被包括的叙述称为 body。假         
如 body 里面包括一个以上的叙述,必须以大括弧 { } 将这些叙述括起      
来,而各个叙述之间需以换行(newline)或分号隔开。                    
                                                                 
                                                            
                                                              
7.1 if 叙述                                                   
                                                               
       if (condition) then-body [else else-body]   
                                                                  (p30 of  
如果 condition 为真(true),则执行 then-body,否则执行 else-body。
                                                                           
   举一个例子如下:                                                
                                                                       
       if (x % 2 == 0)                                          
          print "x is even"                                    
       else                                                      
          print "x is odd"                                            
                                                               
                                                                        
                                                                     
7.2 while 叙述                                                      
                                                                  
       while (condition)                                         
          body                                               
                                                              
while 叙述做的第一件事就是测试 condition。假如 condition 为真则  
执行 body 的叙述。body 的叙述执行完後,会再测试 condition,假如  
condition 为真,则 body 会再度被执行。这个过程会一直被重复直到     
condition 不再是真。如果 condition 第一次测试就是伪(false),则  
body 从没有被执行。                                               
                                                                           
   下面的例子会印出每个输入记录(record)的前三个栏位。              
                                                                       
       gawk '{ i=1                                             
               while (i <= 3) {                                 
                   print $i                                      
                   i++                                                
               }                                               
             }'                                                         
                                                                     
                                                                     
                                                                  
7.3 do-while 叙述                                               
                                                            
       do                                                     
          body                                                  
       while (condition)                                       
                                                                  
这个 do loop 执行 body 一次,然後只要 condition 是真则会重复执行 body。
                                                                  (p32 of  
即使开始时 condition 是伪,body 也会被执行一次。                  
                                                                           
   下面的例子会印出每个输入记录十次。                              
                                                                       
       gawk '{ i= 1                                             
               do {                                             
                  print $0                                       
                  i++                                                
               } while (i <= 10)                              
       }'                                                               
                                                                     
                                                                     
                                                                  
7.4 for 叙述                                                   
                                                            
       for (initialization; condition; increment)            
          body                                                  
                                                               
此叙述开始时会执行initialization,然後只要 condition是真,它      
会重复执行body与做increment 。                                 
                                                              
   下面的例子会印出每个输入记录的前三个栏位。                              
                                                                  
       gawk '{ for (i=1; i<=3; i++)                                    
                  print $i                                      
       }'                                                      
                                                                 
                                                                     
                                                               
7.5 break 叙述                                                         
                                                                     
   break 叙述会跳出包含它的 for、while、do-while 回圈的最内层。      
                                                                  
   下面的例子会找出任何整数的最小除数,它也会判断是否为质数。   
                                                            
       gawk '# find smallest divisor of num                  
            { num=$1                                            
              for (div=2; div*div <=num; div++)                 
                 if (num % div == 0)                              
                    break                              
          if (num % div == 0)
                 printf "Smallest divisor of %d is %d\n", num, div
              else                        
                 printf "%d is prime\n", num }'
                                       
                                    
                          
7.6 continue 叙述                    
                                                                (p34 of 46)
   continue 叙述使用於 for、while、do-while 回圈内部,它会跳
过回圈 body 的剩馀部分,使得它立刻进行下一次回圈的执行。         
                                                                 
   下面的例子会印出 0 至 20 的全部数字,但是 5 并不会被印出。            
                                                              
       gawk 'BEGIN {                        
            for (x=0; x<=20; x++) {         
               if (x==5)                                             
                  continue                     
               printf ("%d",x)                                          
            }                  
            print ""              
       }'                                                         
                                          
                                                
                                       
7.7 next 叙述、next file 叙述、exit 叙述
                          
   next 叙述强迫 gawk 立刻停止处理目前的记录(record)而继续下一   
个记录。                                               
                                                         
   next file 叙述类似 next。然而,它强迫 gawk 立刻停止处理目前   
的资料档。                                                        
                                                                        
   exit 叙述会使得 gawk 程式停止执行而跳出。然而,如果 END 出现
,它会去执行 END 的 actions。               
                                            
                                                                     
                                                
第八章  内建函式(Built-in Functions)                                      
                                
   内建函式是 gawk 内建的函式,可在 gawk 程式的任何地方呼叫内建
函式。                                                              
                                          
                                                
                                       
8.1 数值方面的内建函式                  
                          
int(x)      求出 x 的整数部份,朝向 0 的方向做舍去。例如:int(3.9)
           是 3,int(-3.9) 是 -3。                  
                                                                  (p36 of 46)
sqrt(x)     求出 x 正的平方根值。例 sqrt(4)=2                 
exp(x)      求出 x 的次方。例 exp(2) 即是求 e*e 。               
log(x)      求出 x 的自然对数。                                   
sin(x)      求出 x 的 sine 值,x 是弪度量。                              
cos(x)      求出 x 的 cosine 值,x 是弪度量。                    
atan2(y,x)  求 y/x 的 arctangent 值,所求出的值其单位是弪度量。
rand()      得出一个乱数值。此乱数值平均分布在 0 和 1 之间。这个
           值不会是 0,也不会是 1。                                   
           每次执行 gawk,rand 开始产生数字从相同点或 seed。
srand(x)    设定产生乱数的开始点或 seed 为 x。如果在第二次你设            
           定相同的 seed 值,你将再度得到相同序列的乱数值。
           如果省略引数 x,例如 srand(),则现在的日期、时间会   
           被当成 seed。这个方法可使得乱数值是真正不可预测的。     
           srand 的传回值(return value)是前次所设定的 seed 值。
                                                
                                       
                                          
8.2 字串方面的内建函式   
                                                                  
index(in, find)                           
                                                               (p37 of 46)
   它会在字串 in 里面,寻找字串 find 第一次出现的地方,传回值是
   字串 find 出现在字串 in 里面的位置。如果在字串 in 里面找不到字
   串 find,则传回值为 0。                                       
   例如:                                                               
       print index("peanut","an"                              
   会印出 3。                                                  
                                                               
length(string)                                                         
   求出 string 有几个字元。                                 
   例如:                                                               
       length("abcde"                                      
   是 5。                                                      
                                                                  
match(string,regexp)                                             
   match 函式会在字串 string 里面,寻找符合 regexp 的最长、最靠
   左边的子字串。传回值是 regexp 在 string 的开始位置,即 index
   值。                                   
   match 函式会设定内在变数 RSTART 等於 index,它也会设定内在变
   数 RLENGTH 等於符合的字元个数。如果不符合,则会设定 RSTART 为  
   0、RLENGTH 为 -1。                                 
                                                                  (p38 of 46)
                                                               
sprintf(format,expression1,...)                                    
   举 printf 类似,但是 sprintf 并不印出,而是传回字串。         
   例如:                                                               
       sprintf("pi = %.2f (approx.)',22/7)                     
   传回的字串为"pi = 3.14 (approx.)"                           
                                                               
sub(regexp, replacement,target)                                       
   在字串 target 里面,寻找符合 regexp 的最长、最靠左边的地方,
   以字串 replacement 代替最左边的 regexp。                              
   例如:                                                   
       str = "water, water, everywhere"                        
       sub(/at/, "ith",str)                                       
   结果字串str会变成                                            
   "wither, water, everywhere"                                 
                                                               
gsub(regexp, replacement, target)         
   gsub 与前面的 sub 类似。在字串 target 里面,寻找符合 regexp 的
   所有地方,以字串 replacement 代替所有的 regexp。               
   例如:                                             
                                                                 (p39 of 46)
       str="water, water, everywhere"                           
       gsub(/at/, "ith",str)                                      
   结果字串str会变成                                             
   'wither, wither, everywhere"                                          
                                                               
substr(string, start, length)                                   
   传回字串 string 的子字串,这个子字串的长度为 length 个字元,
   从第 start 个位置开始。                                            
   例如:                                                      
     substr("washington",5,3)                                            
   传回值为"ing"                                            
   如果 length 没有出现,则传回的子字串是从第 start 个位置开始  
   至结束。                                                        
   例如:                                                      
       substr("washington",5)                                   
   传回值为"ington"                                             
                                          
tolower(string)                                                   
   将字串string的大写字母改为小写字母。                           
   例如:                                       
     tolower("MiXeD cAsE 123"                                
   传回值为"mixed case 123"                                       
                                                                 
toupper(string)                                                           
   将字串string的小写字母改为大写字母。                        
   例如:                                                      
       toupper("MiXeD cAsE 123"                                
   传回值为"MIXED CASE 123"                                          
                                                               
                                                                        
                                                            
8.3 输入输出的内建函式                                         
                                                                  
close(filename)                                                  
   将输入或输出的档案 filename 关闭。                           
                                                               
system(command)                           
   此函式允许使用者执行作业系统的指令,执行完毕後将回到 gawk      
   程式。                                                         
   例如:                                      
  BEGIN {system("ls"}                                    
                                                                  
                                                                 
                                                                        
第九章  使用者定义的函式(User-defined Functions)                 
                                                               
   复杂的 gawk 程式常常可以使用自己定义的函式来简化。呼叫使用   
者定义的函式与呼叫内建函式的方法一样。                                 
                                                               
                                                                        
                                                            
9.1 函式定义的格式                                             
                                                                  
   函式的定义可以放在 gawk 程式的任何地方。                     
                                                               
   一个使用者定义的函式其格式如下:                             
                                          
       function name (parameter-list) {                           
          body-of-function                                       
       }                                    
                                                            
name 是所定义的函式之名称。一个正确的函式名称可包括一序列的字      
母、数字、下标线 (underscores),但是不可用数字做开头。            
                                                                        
   parameter-list 是列出函式的全部引数(argument),各个引数之   
间以逗点隔开。                                                  
                                                               
   body-of-function 包含 gawk 的叙述 (statement)。它是函式定义        
里最重要的部份,它决定函式实际要做何种事。                       
                                                                        
                                                            
                                                               
9.2 函式定义的例子                                                
                                                               
   下面这个例子,会将每个记录的第一个栏位之值的平方与第二个     
栏位之值的平方加起来。                                          
                                          
{print "sum =",SquareSum($1,$2)}                                   
function SquareSum(x,y) {                                          
   sum=x*x+y*y                                 
return sum                                                   
}                                                                  
                                                                 
                                                                        
                                                               
第十章  □例                                                   
                                                               
   这里将列出 gawk 程式的一些例子。                                   
                                                               
gawk '{if (NF >; max) max = NF}                                            
     END {print max}'                                       
   此程式会印出所有输入行之中,栏位的最大个数。                 
                                                                  
gawk 'length($0) >; 80'                                          
   此程式会印出一行超过 80 个字元的每一行。此处只有 pattern 被  
   列出,action 是采用内定的 print。                           
                                          
gawk 'NF >; 0'                                                      
   对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简      
   单的方法,将一个档案里的所有空白行删除。        
                                                              
gawk '{if (NF >; 0) print}'                                         
   对於拥有至少一个栏位的所有行,此程式皆会印出。这是一个简      
   单的方法,将一个档案里的所有空白行删除。                              
                                                               
gawk 'BEGIN {for (i = 1; i <= 7; i++)                           
               print int(101 * rand())}'                        
   此程式会印出□围是 0 到 100 之间的 7 个乱数值。                    
                                                               
ls -l files | gawk '{x += $4}; END {print "total bytes: " x}'            
   此程式会印出所有指定的档案之bytes数目的总和。            
                                                               
expand file | gawk '{if (x < length()) x = length()}               
                   END {print "maximum line length is " x}'     
   此程式会将指定档案里最长一行的长度印出。expand 会将 tab 改   
   成 space,所以是用实际的右边界来做长度的比较。               
                                          
gawk 'BEGIN {FS = ":"}                                             
     {print $1 | "sort"}' /etc/passwd                             
   此程式会将所有使用者的login名称,依照字母的顺序印出
                                                              
gawk '{nlines++}                                                   
     END {print nlines}'                                         
   此程式会将一个档案的总行数印出。                                      
                                                               
gawk 'END {print NR}'                                          
   此程式也会将一个档案的总行数印出,但是计算行数的工作由gawk   
   来做。                                                            
                                                               
gawk '{print NR,$0}'                                                      
   此程式印出档案的内容时,会在每行的最前面印出行号,它的功
   能与 'cat -n' 类似。                                         
                                                                  
                                                               
                                                               
第十一章  结论                                                   
                                          
   gawk 对於资料的处理具有很强的功能。它能够以很短的程式完成      
想要做的事,甚至一或二行的程式就能完成指定的工作。同样的一件      
工作,以 gawk 程式来写会比用其它程式语言来写短很多。                                                                 
   gawk 是 GNU 所做的 awk,它是公众软体(Public Domain) 可免费使   
用。


SCO UNIX快速入门

首先声明,本文是在另一位网友的作品基础上增补的。


首先,我们一起看看UNIX的目录,因为清楚了目录,才能对UNIX的框架有个大概的印象!当然这里讲的是系统正常运转所必须的,并且一定不能删除或者修改。

/ 是系统的根目录;
/bin目录中包括最常用的UNIX命令;  
/dev目录包括控制访问外部设备的特殊设备文件;  
/etc目录中包括各种各样的系统程序和数据文件;  
/lib目录里包括C语言以及其他语言程序的运行库文件;  
/mnt目录是一个空目录,是为安装可移动的文件系统保留的;  
/opt目录中包括在所谓的“软件存储目标”;  
/shlib目录中包括系统使用的共享库;  
/usr目录中有几个子目录,(/usr/include目录包括编译C语言程序的头文件;/usr/lib目录包括各种UNIX命令使用的更多的库和数据文件;/usr/spool目录包括各种各样的目录,用于存储那些将被打印、邮寄、或通过网络传递的文件;/usr/tmp目录包括更多的临时文件;/usr/adm目录包括与系统管理或记帐相联系的数据文件;特别地,/usr/adm/messages和/usr/adm/syslog文件包括系统错误消息的记录。)
/stand目录是引导文件系统的安装点,引导文件系统包括安装程序(boot),核心(unix),以及相关的boot文件;
/tcb目录包括所有作为TCB一部分的文件;
/tmp目录UNIX系统程序产生的临时文件;
/var目录包括指定某一单独客户或服务器的非共享SSO文件。


一、目录管理
1、创建目录:mkdir directory_name
比如:在/usr/目录下新建子目录apple
#mkdir /usr/apple 或者
#cd /usr
#mkdir apple

注:mkdir是make directory的缩写

2、列目录内容:
ls  纵向显示
lc  横向显示
ls –l(或简化为l)显示每个文件的详细信息,包括存取模式、链接数、属主、文件大小、上次修改时间等)
ls –a列出所有文件包括隐含文件(在unix要想使某个文件隐藏起来,只要在文件名前加个“.”就可以了。)
ls –F(或lf) 标出文件类型,在目录文件名标记“/”,在可执行文件后标记“*”号,在符号链接后标记“@”。
比如:列出/apple下的文件
#ls /apple
或者:
#cd  /apple
#ls
ls –L或是l命令将显示:
total 20
-rwxrw-r-- 1 apple fruit 1181 Mar 14 2002  dir1
式的内容。
其中,第一行total指明的是总块数。
-rwxrw-r-- apple fruit 1181 Mar 14 2002  dir1这一行中,第一个-,代表是一个普通文件,如果是d(directory)表示是目录文件,如果是l 表示是符号链接(link),b表示是块(block)设备文件,c表示是字符(character)设备文件。
rwxrw-r--中每三个字母为一组,英文名叫triplet,分别指明文件主(user)、同组用户(group)和其他用户(other)的访问权限。
r表示可读(read)、w表示可写(weite)、x表示可执行(excute)

如果一屏显示不下,可能用管道加more或 pg分屏阅读:
# ls |more
# ls |pg

注:ls是list的缩写。

3、目录的重命名:mv oldname newname (可以是目录名或路径名) 比如:将目录 /usr/apple改为/usr/pear
#mv /usr/apple /usr/pear
或者:
#cd /usr  
#mv apple pear

注:mv是move的缩写

4、删除目录:rmdir directory (directory为空),dirctory里有内容时:rm –r directory
比如:删除目录/apple(内容为空)
# rmdir /apple

注:rmdir是remove directory的缩写

5、比较目录:dircmp directory1 directory2


二、漫游文件系统  

1、要想知道你在文件系统中的位置可用pwd 命令。比如, #  pwd
屏幕上将显示:
/usr
表明你现在正在/usr目录下工作。

注:pwd是print word directory的缩写,在unix中,print一般是在在屏幕上显示的意思,而不是打印。

2、改变目录:cd directory 比如:你的当前目录为:/apple 要切换的/usr/pear(当然这个目录要存在),
#cd /usr/pear
然后再用pwd命令查看当前工作目录
pwd
/usr/pear

注:cd是change directory的缩写

三、管理文件  
1、查看文件内容:cat filename  比如:目录/apple下有一个文件love,内容为“I love you all my heart! ”
#cat /apple/love
或者:
#cd /apple
#cat love  
注:也可cat –v filename(不知道文件属于何类型),
cat filename |pg(分屏阅读)。  
由于cat命令原本是用于文件联结的,因此,它只适用于查看不足一屏(一般为24行)的文件。如果文件超过了一屏,就需要用more命令。
比如:
more file1
按空格键显示下一屏,按回车键显示下一行。

注:cat是concatenate 的缩写
more据台湾一位教授的解释,就是“再看一页再看一页”的意思。在Linux里有一个less命令,也是分屏显示的,但是能前后翻页。

cat主要作用是文件的联接,比如,把file1 file2连接起来,成为file3
cat file1 file2 >;file3
其中的 >; 称为改向输出符,如果是把file1连接到file2有末尾,则:
cat file1 >;>; file2

cat命令除了显示和连接文件以外,还有一个常用的功能,就是建立非常小的文本文件,语法格式为: cat >; filename
例如:编辑一个小的shell小程序dl,用来打印一个文件agent008,

cat  >; dl
lp agent008
然后按<ctrl>;+d结束。


查看文件的头部:head filename
查看文件的尾部: tail filename  
2、复制文件:cp filename copyname(filename前面可以加路径)或者:
cp filename …  pathname
比如:将目录/apple下的文件love复制到目录/pear 下
#cp /apple/love  /pear 假如多个文件:
#cp /apple/love1 love2 love3  /pear

注:cp由copy缩写而成。

3、文件的移动和重命名:
文件的移动:mv sourse_file target_directory
比如,将/apple目录下的文件love移动到目录/pear下,
# mv /apple/love /pear

文件的重命名:
在unix里,文件的重命名就是把文件从原文件名(old_filename)下移动到新文件名(new_filename)下:
# mv old_filename new_filename
比如:将目录/apple下的文件love改名为happy,   
# mv /apple/love /apple/happy
或者:
# cd /apple
# mv love happy  

注:mv由move缩写而来

4、删除文件:rm filename(一定要小心使用呀,unix由于早期只是专业人员使用,提倡严谨的工作作风,所以在执行命令时往往不要求确认,如果执行成功,就给出结果,执行不成功,才给出出错信息,所以,对你不熟悉的命令千万不要像windows一样去试,因为指令一旦发出,unix就会不折不扣地执行,没有像windows那样“悔棋”的机会。)
为了防止误删除文件,良好的习惯是加上-i选取项。
比如,rm -i file1
系统会要求你确认是不是真的要删除,待你确认后再删除。

注:rm由remove缩写而来

5、在文件中查找指定的字符串:grep options text filenames
这个命令好比用word打开一篇文件后,查找某一字符串。不同的是,在unix中,用grep命令,不用打开文件。比如,
# grep root /etc/passwd
就可以显示出root用户的有关信息。
再比如,加上管道,可以一次查出某一终端的所有进程号。
# ps –e|grep tty03
就可以查出终端tty03的所有进程号。当然,查出进程号的目的一般是为了kill它们。那么怎么一次实现呢?这就需要用到awk命令了。
比如,要kill tty03的所有进程,可以用命令
# kill –9 ‵ps –e|grep tty03|awk ‘{print $1}’‵
注意,ps前面和最后的的那个符号,是倒引号,在数字“1”的左边。

查找文件: find path_list expression
其中,path_list是查找的目录列表,可以是一个目录,也可以是多个目录。如果是多个目录之间,要以空格符分开。如果从当前目录开始查找,可以用“.”号表示,如果是从根目录开始查找,就要使用“/”来表示。
expression项(表达式)是查找条件,用户利用它可以设定是按文件的名字、日期或是其他条件来查找。我经常用的是名字。
比如:在/usr下,查找一个名为ttytab的文件
# find /usr –name ttytab –print
其中的-name指明是用名字查找,-print是告诉系统,找到ttytab文件后在屏幕上显示它在什么位置。不过在sco openserver中可以省略-print。
在windows98中,我们可以用“查找”一次性删除所有临时文件。在unix里,我们也可以用find一次删除符合某些条件的文件,比如,在/usr目录及其子目录中,删除所有以txt为扩展名的文件。
find /usr –name *.txt –exec rm {}\;
-exec command_name {}\; 找出与条件匹配的文件后,执行command_name所指定的命令。注意,这条命令的结尾必须有{}\;


四、文件和目录的存取控制  
1、改变文件的权限:
chmod  who [+-=] operator_ permission filename
who包括u g o,分别代表用户(user)、同组用户(group)和其他用户(other)
+ 增加权限
-减少权限
=增加等号后面的权限,同时减去原来的权限
operator_ permission包括r(read)、w(weite)、x(excute)。
比如:chmod u+x filename
给文件主以执行权
这有一种方式:chmod mode filename
其中mode为nnn模式,n是0-7之间的数,4表示可读,2表示可写,1表示可执行。nnn中第一个n是用户的权限,第二个n是同组用户的权限,第三个n是其他用户的权限。如果如赋予可读可写两个权限,则用6(4+2而来),而如果要赋予可读可写可执行全部权限就用7表示。
例如:chmod 777 file1
就是把file1让所有用户可读可写可执行。
而chmod 740 file1则是的权限设置为文件的主人自己可读可写可执行,同组用户只读,其他用户连看都不行了。0表示没有任何权限。

chmod由change mode缩写而来

2、改变文件属主:chown new_owner [:group_name] filename
例如:改变文件file1主人为apple
$ chown apple file1
要注意的是,除非你是root,否则,给了别人的文件你自己可就要不回来了。假如你是pear,在你运行了chown apple file1后,你就把文件给了apple。如果你再运行chown pear  file1。系统就会告诉你没有这个权限。要想把给人家的文件再要回来,只有求助于root用户。
如果还要改变文件的所属组,apple用户要把文件file1送给fruit组的apple用户,可以使用命令:
chown apple:fruit file1

注:chown由change owner缩写而来

改变文件的属组也可以用chgrp命令
3、查看你所在的组:id
4、改变当前用户组:sg
5、改变文件所在的用户组:chgrp new_group filename
比如:chgrp fruit file1

注:chgrp:由change group缩写而来

6、在命令行中获得帮助man [section] keywork 比如:
man C kill

注:man由manual(手册)缩写而来

五、磁盘的使用  
1、软盘的格式化:format [设备名]
比如:格式化1.44M软盘:
#format /dev/rfd0135ds18
r表示是原始(raw)设备,fd表示是软驱,0表示第一个软驱,135表示135个磁道,ds表示双面磁盘,18表示18个扇区。
unix中,format命令只能格式化软盘,不能格式化硬盘。
另外,如果在/etc/default/format文件中,DEVICE定义的是缺省的设备名,一般都是DEVICE=/dev/rfd0135ds18,所以你可以只键入format就可完成对软盘的格式化。

2、软盘的复制:diskcp  [optition] [-135ds18]
optition有多个选项,但现在的PC一般只有一个软驱,所以常用的就剩下一个-f(format)了,-135ds18代表我们常用的1.44M软盘。
比如:
$ diskcp –f –135ds18
复制时先对目标盘格式化,然后再复制。

3、用软盘备份文件:比如将硬盘目录下/apple的文件love存储到空软盘上,你可以:
#cd /apple
#tar cv6 love
c 表示在创建(create)一个新文件,并且覆盖已有的同名文件。如果不想覆盖。命令为:
#tar uv6 love
v 显示每个被处理的文件名。
6表示是软驱。数字和设备的对应关系,在/etc/default/tar文件中定义,可用more /etc/default/tar命令或是不带任何参数的tar命令查看,也可用vi修改。

4、列出软盘中文件的名字:#tar tv6

5、将软盘中文件恢复到硬盘:#tar xv6
x表示抽取(extract)

六、增加用户和切换用户
1、增加用户:#scoadmin account
里面可有好多东东哟!你可以添加用户,添加组,删除用户和组,当然也可以修改,呵呵,可以打开看一下的!比如:添加一个用户apple,你可以:
#scoadmin account →user→Add New User
出现增加用户的界面:

Login:apple
User ID:200
Comment:
Password:<*>;Set password now <>;Set password later
Login shell:sh          [Change Login Shell…]
Networked via:          [Change Distribution…]
Home Directory:/usr/apple
Login Group:group       [Change Group Membership…]
       [OK]    [Cancel]   [Help]

输入有关信息后,将光标移动到OK处,按回车键。
注释:
Login:处输入用户名
User ID:用户ID,一般用系统推荐值即可。小于200的为系统用户,0超级用户使用。
Comment:对用户的注释说明,可以不输。
Password: Set password now,现在就设置口令。
         Set password later以后再设置口令
Login shell:sh用户的注册shell,系统缺省的是sh,即标准 shell,如果要更改,把光标移到Change Login Shell…]处回车,选择别的shell,如csh ksh……。
Networked via:   一般不用设置。
Home Directory:用户的家目录(一般都是译成主目录,不过我觉得译成家更形象些。一般系统会自动在/usr目录下,为新用户建立一个“/usr/用户名”的家目录,比如本例是
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP