UNIX下SHELL编程.docx
- 文档编号:7783428
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:30
- 大小:45.80KB
UNIX下SHELL编程.docx
《UNIX下SHELL编程.docx》由会员分享,可在线阅读,更多相关《UNIX下SHELL编程.docx(30页珍藏版)》请在冰豆网上搜索。
UNIX下SHELL编程
产品名称Productname
密级Confidentialitylevel
内部公开
产品版本Productversion
Total18pages共18页
UNIX下SHELL编程
Preparedby
拟制
范洪滔26678
Date
日期
2005-09-01
Reviewedby
评审人
Date
日期
yyyy-mm-dd
Approvedby
批准
Date
日期
yyyy-mm-dd
HuaweiTechnologiesCo.,Ltd.
华为技术有限公司
Allrightsreserved
版权所有XX
(DVP05T08V1.1/IPD-CMMV3.0/forinternaluseonly)
(DVP05T08V1.1/IPD-CMMV3.0/仅供内部使用)
RevisionRecord修订记录
Date
日期
RevisionVersion
修订
版本
CRID/DefectID
CR号
SecNo.
修改
章节
ChangeDescription
修改描述
Author
作者
2005-10-14
1.00
initial初稿完成(只有AWK部分的介绍)
范洪滔26678
1.
Name+ID
姓名+工号
1.
Catalog目录
1AWK5
1.1AWK简介5
1.1.1AWK的功能5
1.1.2AWK的限制5
1.1.3应用场所5
1.1.4如何学习5
1.1.5程序所在路程6
1.1.6处理机制6
1.1.7命令启动参数7
1.1.8退出状态8
1.2模式(pattern)8
1.2.1模式的种类8
1.2.2正则表达式8
1.2.3关系表达式12
1.2.4模式的组合12
1.2.5BEGIN和END模式13
1.3完整的AWK流程13
1.4变量14
1.4.1特殊变量14
1.4.2标量变量15
1.4.3数组变量15
1.4.4字段变量16
1.5操作符16
1.5.1算术操作符16
1.5.2一元操作符16
1.5.3赋值操作符17
1.6操作(Action)17
1.6.1条件语句17
1.6.2输出语句18
1.7内置函数20
1.7.1算术函数20
1.7.2字符串处理函数20
1.7.3其它函数21
1.8用户自定义函数22
1.9示例代码23
1.9.1要求行尾有一个字段分隔符23
1.9.2删除多余的字段23
1.9.3对某一位实现定长n位,并且后补F23
1.9.4挑出异常话单24
1.9.5从日志中挑出相关信息24
1.9.6伪造记录25
TableList表目录
表1awk识别的转义序列11
表2AWK的特殊变量14
表3awkprintf所使用的修饰符19
表4AWK算术函数20
表5AWK字符串处理函数20
表6AWK中的其它函数21
FigureList图目录
Figure1**图错误!
未定义书签。
图1**图错误!
未定义书签。
UNIX下SHELL编程
1AWK
1.1AWK简介
1.1.1AWK的功能
AWK被设计为一种方便的文本处理脚本。
1.1.2AWK的限制
AWK只被设计为处理文本文件,不支持数据库、socket这样的特性。
AWK不支持用户扩展——和目前流行的TCL、Python这样的脚本不一样,AWK不支持用户扩展。
也就是说,你的实现完全依赖于AWK自身所提供的功能,如果AWK没有提供相应的功能,用户自己是没有办法通过对AWK做一些修改来完成相应的功能的。
1.1.3应用场所
虽然AWK存在一些限制,但是因为它属于UNIX的标准程序,在任何机器上都会有AWK的某种实现。
加之本身的功能也还算比较强大,如果只是想实现文本挑选、转换这样的工作,还是建议使用,这样可以不受机器的限制。
另外,在进行SHELL编程时,常使用AWK来进行一些文字处理,比如,对命令ps-ef的结果进行处理,从中获取进程号。
1.1.4如何学习
在C语言中,程序所执行的每个功能都是程序员写的,在AWK中,除了程序员所写的代码之外,还有AWK内置的一些机制,所以,要学习AWK编程,首先要了解AWK的工作原理,要知道AWK在代码之外都做了什么。
在了解AWK的机制之后,就可以沿着“模式、变量、语句、函数”的顺序依次学习。
AWK的模式中,主要的内容是正则表达式,如果对正则表达式不太了解,也没有太大关系,只要知道模式的概念,就可以先学习后面的内容,等其它内容学完之后,再回过头来学习。
像特殊变量、内置函数、语句格式这样一些内容,能记住当然是最好不过的。
有些记不住也没有太多关系,需要时再查看本文档或系统的man手册。
1.1.5程序所在路程
本文所描述的AWK在各个操作系统下,分别位于:
AIX:
/usr/bin/awk
HP:
/usr/bin/awk
SUN:
/usr/xpg4/bin/awk
需要注意,在SUN下,有三个awk程序,/usr/bin/awk、/usr/bin/nawk和/usr/xpg4/bin/awk。
本文中所说的awk只是/usr/xpg4/bin/awk。
另外两个awk功能不完备,注意不要使用。
1.1.6处理机制
一个AWK程序由一个或多个pattern、action语句组成,action写在大括号里面。
不同的pattern、action语句之间使用换行或分号来分隔。
这样,AWK程序大致就形如:
pattern{action}
pattern{action}
......
可以这样理解,pattern是条件,action是动作。
对待处理文件中的每一条记录,AWK会依次判断是否满足各个pattern,如果满足,则执行对应的action。
一个pattern、action处理完后,会接着处理下一个pattern、action,直到将AWK程序中所有的pattern、action对处理完为止,这样才算对一条记录处理完毕。
pattern或action可以被省略,但不能同时被省略。
如果pattern被省略,则对于输入文件的每一条记录,action都会被执行。
如果action(包括大括号)被省略,则系统缺省会输出满足pattern的行。
相当于action是{print$0}
在action中,可以出现if、for这样的分支、循环语句,所以,AWK具有一定的编程能力。
AWK会根据所指定的记录分隔符(RS),将待处理文件分隔成多个记录(record,通常一个记录就对应于文件中的一行)。
再根据指定的字段分隔符(FS,缺省时是space,包括空格和tab),将每一行分隔成多个字段(field)。
在AWK中,使用$1、$2……、$n来访问各个字段,而$0则表示整个记录。
假设待处理文件内容为:
Thisisadog.
Thatisanapple.
如果使用缺省的RS和FS(分别是换行符和space),则AWK会先读取一行,“Thisisadog.”,然后将其分成四个字段“this”、“is”、“a”和“dog.”。
AWK在将一条记录分隔成多个字段后,才会依照pattern在awk文件中出现的顺序依次匹配各个pattern。
在一个patten匹配成功后,就会执行相应的action。
可以参考“完整的AWK流程”一节。
1.1.7命令启动参数
awk启动格式为:
awk[-FEre][-vAssignment]...{-fProgramFile|'Program'}[[File...|Assignment...]]...
注意:
启动参数的顺序是不能随便调整的,比如,-vAssignment就不能放在File之后。
所以,最保险的做法,就是严格执照上面顺序来写。
1.-FEre
使用扩展正则表达式Ere作为字段分隔符(对应于特殊变量FS)
2.-vAssignment
定义可以在AWK语言中访问的标量变量。
Assignment的格式为:
Name=Value(注意,Name,=,Value三者之间不能有空格!
),其中,Name是变量的名字,可以是任何以字符或下划线开头,后跟字母、下划线和数字的任意组合。
Value是变量的值,可以是下划线、数字和字母的任意组合。
且前面和后面都有一个”(双引号),如果Value部分是数字,则也将为变量指定对应的数字值。
通过-v标志指定的赋值操作发生在BEGIN操作之前,所以,可以在BEGIN操作中引用。
可以有多个-v标志,用来为多个变量赋值。
3.-fProgramFile
从ProgramFile变量指定的文件名中获取AWK命令的指令。
如果多次指定-f标志,则文件的串联(按照指定的顺序)将用作指令集。
4.'Program'
包含awk命令的指令。
如果不指定-f标志,Program变量应该是命令行上的第一个项,并且应该包括在’’(单引号)中。
如:
awk‘{print$0}’x.unl
5.Assignment
和“-vAssignment”的功能相同,只是执行的时间不一样。
Assignment会在awk程序扫描到Assignment才被执行。
可以参考“完整的AWK流程”一节。
注意,从AWK的流程中可以看出,BEGIN操作中不能访问Assignment所指定的变量!
但可以访问-vAssignment所指定的变量。
6.File
指定包含要处理的输入的文件名称。
如果不指定File变量,或指定了-(减号),则处理标准输入。
1.1.8退出状态
AWK命令返回值为:
0表示成功执行完毕
>0发生错误
如果是在SHELL编程中执行awk命令,则通常需要判断awk命令的返回值。
注意:
可以通过在awk命令中使用exit[Expression]语句来更改程序的退出状态。
1.2模式(pattern)
1.2.1模式的种类
模式可以有以下几种类型:
1.正则表达式
2.关系表达式
3.模式的组合
4.BEGIN和END模式
1.2.2正则表达式
awk所使用的扩展正则表达式类似于grep和egrep。
当记录满足正则表达式的内容时,就认为模式匹配。
一个regularexpression以斜线('/')包围当作AWK的pattern。
如果输入记录含有regexp就视为符合。
例如:
pattern为/foo/,对於任何输入记录含有'foo'则视为符合。
awk'/foo/'input.txt
regexp也能使用在比较的算式:
exp~/regexp/:
如果exp符合regexp,则结果为真(true)。
exp!
~/regexp/:
如果exp不符合regexp,则结果为真。
awk-F"|"'$2~/abc/'f.unl#打印出第2个字段包含abc的记录
假定一个名为testfile的文件具有以下内容:
smawley,andy
smiley,allen
smith,alan
smithern,harry
smithhern,anne
smitters,alexis
格式约定:
以“>>”作为命令行的提示符,
>>awk'/sm[a-h]/'testfile
smawley,andy
表示执行命令awk'/sm[^a-h]/'testfile,输出的结果为smawley,andy。
在正则表达式中,可以的特殊字符有:
1.+(加号,plussign)
+表示重复前面的规则一次或多次。
>>awk'/smith+ern/'testfile
smithern,harry
smithhern,anne
将包含smit,且后跟一个或多个h,再以ern结尾的字符串的记录打印至标准输出。
2.?
(问号,questionmark)
+表示重复前面的规则零次或一次。
>>awk'/smith?
/'testfile
smith,alan
smithern,harry
smithhern,anne
smitters,alexis
将包含smit,后有零个或一个h字符的记录打印至标准输出。
3.|(垂直线,verticalbar)
|表示多个规则中只要有一个满足就可以。
>>awk'/allen|alan/'testfile
smiley,allen
smith,alan
将包含字符串allen或alan的所有记录打印至标准输出。
4.()(小括号)
()用于将字符串组合在一起。
>>awk'/a(ll)?
(nn)?
e/'testfile
smiley,allen
smithhern,anne
将具有字符串ae或alle或anne或allnne的所有记录打印至标准输出。
5.{m}
如果正好有m个模式的具体值位于字符串中,则字符串匹配。
>>awk'/l{2}/'testfile
smiley,allen
将有2个l的字符串打印至标准输出。
注:
如果有多于2个l,比如,alllen,也算是匹配。
为了避免这种情况,通常应该在{m}前、后再多指定一些模式。
如:
/al{2}en/,这样就只可能匹配allen。
/al{2}en/是指在模式a和en中间含有且只有两个模式'l',例如如果存在'acllben'和'alllen'用上述方法就匹配不出来。
下面的{m,}和{m,n}也有类似的情况。
6.{m,}
如果至少有m个模式的具体值位于字符串中,则字符串匹配。
如,
>>awk'/t{2,}/'testfile
smitters,alexis
将至少有两个连续的t出现的记录打印至标准输出。
7.{m,n}
如果有m和n之间(包括m和n)个模式的具体值位于字符串中,则字符串匹配。
>>awk'/er{1,2}/'testfile
smithern,harry
smithhern,anne
smitters,alexis
注:
m、,(逗号)和n之间,不能有空格出现!
8.[String]
指定正则表达式与方括号内String变量指定的任何字符匹配。
如:
>>awk'/sm[a-h]/'testfile
smawley,andy
将具有sm后跟以字母a到h之间的任何字符的所有记录打印至标准输出。
如果是字母或数字存在连续的情况,则可以使用“起始字母-终止字母”的简写方式,如:
[x-z]表示从x到z的所有字母。
如果是不连续字母/数值,则直接写出所有的单个字母,如[axz]表示a、x、z这三个字母。
9.[^String]
在[](方括号)和在指定字符串开头的^(插入记号)指明正则表达式与方括号内的任何字符不匹配。
>>awk'/sm[^a-h]/'testfile
smiley,allen
smith,alan
smithern,harry
smithhern,anne
smitters,alexis
10.~和!
~
表示指定变量与正则表达式匹配(代字号)或不匹配(感叹号、代字号)的条件语句。
>>awk'$1~/n/'testfile
smithern,harry
smithhern,anne
将第一个字段包含字符n的所有记录打印至标准输出。
11.^(circumflex)
指定字段或记录的开头。
>>awk'$2~/^h/'testfile
smithern,harry
把字符h作为第二个字段的第一个字符的所有记录打印至标准输出。
12.$(dollarsign)
指定字段或记录的末尾。
>>awk'$2~/y$/'testfile
smawley,andy
smithern,harry
把字符y作为第二个字段的最后一个字符的所有记录打印至标准输出。
13..(句号,period)
表示除了在空白末尾的终端换行字符以外的任何字符。
>>awk'/a..e/'testfile
smawley,andy
smiley,allen
smithhern,anne
将具有两个字符隔开a和e所有记录打印至标准输出。
14.*(星号,asterisk)
表示重复前面的规则零次或多次。
>>awk'/a.*e/'testfile
smawley,andy
smiley,allen
smithhern,anne
smitters,alexis
将具有零个或多个字符隔开a和e所有记录打印至标准输出。
15.\(反斜杠,backslash)
转义字符。
当位于扩展正则表达式中具有特殊含义的任何字符之前时,转义字符除去该字符的任何特殊含义。
如,
/a\/\//
将与模式a//匹配,因为反斜杠否定了斜杠作为正则表达式定界符的通常含义。
要将反斜杠本身指定为字符,则使用两个反斜杠。
16.识别的转义序列:
awk命令识别大多数C语言中约定的转义序列,以及awk命令本身用作特殊字符的几个转义序列。
如下表:
表1awk识别的转义序列
转义序列
表示的字符
\”
”(双引号)字符
\/
/(斜杠)字符
\ddd
其编码由1、2或3位八进制整数表示的字符,其中,d表示一个八进制数位
\\
\(反斜杠)字符
\a
警告字符
\b
退格字符
\f
换页字符
\n
换行字符
\r
回车字符
\t
跳格字符
\v
垂直跳格
注:
除了在gsub、match、split和sub内置函数中,扩展正则表达式的匹配都基于输入记录。
记录分隔符(缺省情况下为换行字符)不能嵌套在表达式中,且没有与记录分隔符字符匹配的表达式(因为awk是先对记录、字段作了分隔,才进行匹配操作的)。
如果记录分隔符不是换行字符,则可与换行字符匹配。
在指定的四个内置函数中,匹配基于文本字符串,且任何字符(包含记录分隔符)可以嵌套在模式中,这样模式与适当的字符相匹配。
然而,用awk命令进行的所有正则表达式匹配中,在模式使用一个或多个NULL(空)字符将生成未定义的结果。
1.2.3关系表达式
关系运算符<(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、==(等于)和!
=(不等于)可以用来形成模式。
例如,模式:
$1<$4
将与第一个字段小于第四个字段的记录匹配。
关系运算符还可以和字符串值一起使用,例如:
$1!
=“q”
将与第一个字段不是q的所有记录匹配。
字符串值还可以根据校对值匹配,如:
$1<=“d”
将与第一个字段以字符a、b、c或d开头的所有记录匹配。
如果未给出其它信息,则字段变量作为字符串值进行比较。
1.2.4模式的组合
可以使用三种选项组合模式:
●范围由两种以,(逗号)隔开的模式指定。
操作在每个以匹配第一个模式的记录开始的每个记录上执行,并通过匹配第二个模式的记录(包含此记录)继续。
例如:
/begin/,/end/
与包含字符串begin的记录以及该记录和包含字符串end之间的所有记录(包括字符串end的记录)匹配。
●括号()将模式组合在一起。
●布尔运算符||(或)、&&(和)以及!
(不)将模式组合成如果它们求值为真则匹配,否则不匹配的表达式。
例如:
模式:
$1=="al"&&$2=="123"
与第一个字段是a1且第二个字段是123的记录匹配。
1.2.5BEGIN和END模式
用BEGIN模式指定的操作在读取任何输入之前执行。
用END指定的操作在读取了所有输入后执行。
允许多个BEGIN和END模式,并以指定的顺序处理它们。
在程序语句中END模式可以在BEGIN模式之前。
如果程序仅由BEGIN语句构成,则执行操作且不读取输入。
如果程序仅由END语句构成,则在任何操作执行前读取所有输入。
1.3完整的AWK流程
可以使用下面的伪码来表示完整的AWK处理流程:
for(i=0;i<启动参数中-vAssignment数目;i++)
{
执行第i个-vAssignment,为相应的变量赋值
}
for(i=0;i { 处理第i个BEGIN模式对应的操作 } for(i=0;i<启动参数中File及Assignment参数的总个数;i++) { if(第i个参数是Assignment) { 执行对应的Assignment,为相应的变量赋值 continue; } 打开第i个参数对应的待处理文件 while(not文件结束) { 根据RS,从待处理文件中读取一条记录 根据FS,将读取的记录分隔成不同的字段 for(j=0;j { if(第j个pattern匹配成功)//如果没有指定pattern,则总是匹配成功 { 执行对应的action//如果没有指定action,缺省为print$0 } }//所有pattern匹配结束 }//一个文件处理结束 }//所有文件都处理结束 for(i=0;i { 处理第i个END模式对应的操作 } 从上面的流程中可以看出,在AWK中,有三种不同优先级别的模式,按照优先级从高到低,依次是: BEGIN模式、普通模式(除了BEGIN和END之外的其它模式)、END模式。 同一优先级的多个模式,AWK是执照在AWK文件中出现的先后顺序执行的。 不同优先级的模式可以在AWK文件中按照任意顺序放置。 1.4变量 AWK中的变量可以是标量(scalars)、数组(arrayelements)、字段变量(fields)和特殊变量。 变量名称不能以数字开始。 AWK中的变量不需要在使用前先进行申明,变量可以具有数字值和/或字符串值,并根据上下文的不同而呈现出数字或字符串。 未初始化的标量变量和数组元素具有一个为0的数字值和一个为空串(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UNIX SHELL 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)