




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于命令(胶水)的编程语言SHELL、AWK、PERL2013.05诺恩科技研发基础培训课程必修选修公开保密
本课程主要讲述基于命令行模式的shell、awk编程,并初步描述perl在数据处理中的一般使用方式;这几种编程语言的特点是短小、起到串联程序的作用,配合操作系统自带的crontab,能够比较好的执行周期性的任务,多用于应用程序的定时执行、维护过程中的周期性、规律的错误检查;说明目录编程概要SHELLAWKPERL开发语言没有不好的开发语言,只有不精通的开发语言怎样学习一门开发语言123变量定义保留字、系统变量逻辑控制:判断、循环程序结构:必须的模块如何连接数据库文件操作控件、组件互相调用及传递低层硬件操作协议操作如何优化异常处理数据库原理数据结构编译原理算法+数据结构变量定义-匈牙利命名法前缀
类型例子备注LmClass
LmObject表示类型本身
不与范围前缀结合使用
IInterface接口
IUnknown一般情况下,变量的取名方式为:
<scope_>+<prefix_>+<qualifier>。范围前缀_,类型前缀_,限定词。前缀类型例子备注g_全局作用域
g_Servers
m_成员变量
m_pDoc,l_局部作用域
l_strName少用
范围前缀前缀类型内存规格描述例子chchar8-bitcharacterchGradechTCHAR16-bitcharacterif_UNICODEisdefinedchNamebBOOLBooleanvaluebEnablednintInteger(sizedependentonoperatingsystem)nLengthnUINTUnsignedvalue(sizedependentonoperatingsystem)nLengthwWORD16-bitunsignedvaluewPoslLONG32-bitsignedintegerlOffsetdwDWORD32-bitunsignedintegerdwRangep*AmbientmemorymodelpointerpDoclpFAR*FarpointerlpDoclpszLPSTR32-bitpointertocharacterstringlpszNamelpszLPCSTR32-bitpointertoconstantcharacterstringlpszNamelpszLPCTSTR32-bitpointertoconstantcharacterstringif_UNICODEisdefinedlpszNamehhandleHandletoWindowsobjecthWndlpfn(*fn)()callbackFarpointertoCALLBACKfunctionlpfnAbort类型缩写编程几个好习惯动手编码之前,你需要对要编码实现的解决方案有一个正式的或粗略的设计。永远不要在没有任何设计的前提下就开始编码,除非所编代码不重要。优秀的代码文档跟编程语言知识一样重要。在代码源文件中,为每个主要的代码段添加注释,解释代码的基本逻辑。最好注明程序的构建和修改日期,以及修改的原因也是非常有必要的。
维护程序的各个版本同样重要。有些编程工具都自带一个版本管理工具。无论你什么时候改变自己的程序,它们都会将其保存为.bak文件
如果工程包含多个源文件,则创建一个README文件,注明每个源文件、数据文件、临时文件以及日志文件(如果有的话)的作用。你还可以注明编译和运行步骤
有时候,你一定想知道为什么IF语句没有得到预想的结果。可能你使用的是等号,也就是“=”,而不是条件判定符号“==”。一个比较好的办法是用相反的顺序写条件语句。因此,你的条件语句应该如下:if(10==i)…因此,如果你错误地写成了单个等于号,在编译的时候也能检查出来并报错使用循环和条件语句时,先把左右括号对应起来,然后再在里面写其他语句使用有意义的变量和函数名称。例如,使用‘radius’来代替圆的半径,而不是用‘r’来表示。同样,函数名‘calculateArea’要比其他任何隐晦的缩写要好得多。匆忙之下,我们也许会使用缩写的变量名,但一开始节省时间的话,之后会浪费更多的时间,去猜测缩写变量名代表什么
为后面的调试使用打印语句,这是个好习惯。但是,当完成最后代码后,去掉这些语句,有时也是一项危险的任务。添加一个方法,用于输出调试信息。当最终版本生成时,只要把这个方法注释掉就行。因此,只在一个地方做修改就可以了
代码编写完之后,开始优化代码。之前声明的一些变量,现在可能没用了。同样,并不依赖循环的一些声明可以移到循环模块之外去。扎实的编译知识同样会对以后的代码优化有所帮助
对自己的操作系统和硬件要有足够的了解,你可以从资源占用等方面提升程序的性能
编写代码时要合理使用缩进,以使代码清晰可读
研究别人编写的代码。这可以让你学习到新的编程技术,以及他们解决和你相同的任务时所使用的方法
最后一条(但不是最不重要的一条),备份源代码文件,这样当硬盘出错或相同的问题发生时,不至于前功尽弃。
SHELL、AWK、PERL的特点都是解释性执行的开发语言;SHELL、AWK不能完全称之为一门独立的开发语言,不合适完成大型的应用系统;变量都没有类型的限制,仅在上下文使用环境中才能区分出其类型;命令行方式明显,大量的程序构成是独立的命令,这些命令基本来自于操作系统本身基本上没有界面开发能力系统结构基于调用,触发少正则表达式通用,并且是关键,体现出灵活性,单独学习正则表达式项目SHELLAWKPERL引号双引号内变量被解析,单引号内是字符串双引号内是字符串,单引号内变量被解析双引号内变量被解析,单引号内是字符串比较符字符型比较符判断数字一套字符型比较符判断字符Awk的双引号内如果是os的命令,则可以被执行,如print$2|”sort”目录编程概要SHELLAWKPERLSHELL不适合的场景复杂的大项目需要灵活处理文件的程序,SH只能逐行读出文件进行处理需要图形用户界面的程序需要直接与系统硬件打交道的程序需要访问I/O端口和网络套接字的程序需要使用库或和以前的其他代码整合的程序SHELLBSH,缺省SHELLCSHKSH,融合了BSH和CSH的优点基本一样,个别语法上有区别切换时执行对应SHELL程序,如kshSHELL-初识SHELL-变量如果在一个字符串中引用变量不容易被区分,使用${变量名},如计费话单的文件名里替换账期FILEBILL${BILL}XXX.txt;在双引号中可以被变量值替换,在单引号中无法替换;SHELL-系统变量$IFS这个变量中保存了用于分割输入参数的分割字符,默认识空$HOME这个变量中存储了当前用户的根目录路径。$PATH这个变量中存储了当前Shell的默认路径字符串。$PS1表示第一个系统提示符。$PS2表示的二个系统提示符。
$PWD表示当前工作路径。$EDITOR表示系统的默认编辑器名称。$BASH表示当前Shell的路径字符串。$0,$1,$2,...表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$#表示脚本程序的命令参数个数或函数的参数个数。
$$表示该脚本程序的进程号,常用于生成文件名唯一的临时文件。$?表示脚本程序或函数的返回状态值,正常为0,否则为非零的错误号。
$*表示所有的脚本参数或函数参数。$@和$*涵义相似,但是比$*更安全。$!表示最近一个在后台运行的进程的进程号。$RANDOM获取随机变量1-65535间的整数;SHELL-变量使用SHELL-变量计算SHELL-引号的使用SHELL-通配符正则表达式,模式匹配:^开始,$结束,^$空行SHELL-状态判断SHELL-条件判断SHELL-条件判断(续)SHELL-测试文件test–daaaSHELL-条件控制SHELL-程序退出为了避免程序重复执行,可以使用文件来判断SHELL-FOR循环SHELL-FOR循环SHELL-WHILESHELL-出口break退出当前循环,继续下面的语句continue退出循环的本次运行,进行下一个循环exit退出程序return返回值,一般函数使用filenm=`ls/etc`forafilein$filenmdoif[$afile==“XXX”];then
break
continue
exit1fidoneSHELL-CASESHELL-函数提高复用,简化程序结构SHELL-界面SHELL-程序结构#!/bin/sh#########################程序说明#########################跟踪程序执行set–x#函数定义func()#若干命令或循环、判断等cd#退出,也可以不写exit0SHELL-程序可以把帮助等写成函数,判断执行参数展示对应内容下面的脚本将会提示如下的信息:1)希望登录的远程主机。2)文件传输的类型是二进制方式还是ASCII方式。3)要下载的文件名。4)存放下载文件的本地目录。实现脚本如下:SHELL-程序-ftpshell脚本一个常用的用途就是访问数据库系统获得信息。实现这样的功能,<<是再理想不过了。可以用它来输入你在面对数据库提示时所做的各种选择。下面的例子介绍如何使用<<来连接其他应用程序,完成相应的任务。SHELL-程序-dbSHELL-定时或周期运行-crontabcrontab命令举例说明crontabmyfile将myfile的内容取代crontabs原内容crontab-r删除现有的crontabs文件crontab-l显示现有的crontabs文件内容crontab–e编辑现有的crontabs文件内容各字段取值举例说明*表示任何时间1,3,4表示离散数字1-5表示从1到51-3,5表示从1到3,还有5collrecord.sh2013041>/log/col.log2>/dev/nullcollrecord.sh201304&>/dev/null.profile命令环境初始化,也可以单独写一个env的程序先执行目录编程概要SHELLAWKPERLAWK
AWK是一种用于处理文本的编程语言工具。AWK在很多方面类似于shell编程语言,尽管AWK具有完全属于其本身的语法。它的设计思想来源于SNOBOL4、sed、MarcRochkind设计的有效性语言、语言工具yacc和lex,当然还从C语言中获取了一些优秀的思想。在最初创造AWK时,其目的是用于文本处理,并且这种语言的基础是,只要在输入数据中有模式匹配,就执行一系列指令。该实用工具扫描文件中的每一行,查找与命令行中所给定内容相匹配的模式。如果发现匹配内容,则进行下一个编程步骤。如果找不到匹配内容,则继续处理下一行。AWK:Aho、Weinberger、KernighanAWK、GAWK、NAWKAWK-执行方式AWK-执行方式
1.常用模式
awk‘pattern{action}’filenameawk扫描filename中的每一行,对符合模式pattern的行执行操作action.特例:①awk‘pattern’filename
显示所有符合模式pattern的行②awk‘{action}’filename
对所有行执行操作action复杂的模式是把‘pattern{action}’替换为一个awk的程序AWK-执行方式$catemployeesTomJones44245/12/66543354MaryAdams543611/4/6328765SallyChang16547/22/54650000BillyBlack16839/23/44336500$awk‘/Mary/’employeesMaryAdams543611/4/6328765$awk‘{print$1}’employeesTomMarySallyBilly$awk‘/Sally/{print$1$2}’employeesSallyChangAWK-执行方式2.从其它命令输入格式:command|awk‘pattern’command|awk‘{action}’command|awk‘pattern{action}’实例:$whozhanglantty01Jan1218:36yuexitty02Jan1217:03liuzhentty15Jan1208:45$who|awk‘/tty01/{print$1}’(谁在1号终端上)zhanglan
AWK-执行方式3.从标准输入设备(键盘)输入格式:awk‘pattern{action}’由于未指定输入数据来源,缺省情况下从标准输入设备(键盘)读取数据.键盘上每输入一行,awk就处理一行,直到遇到^D为止.例如:$awk‘/aaa/{print$0,NF}’bbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4(awk的输出行)xxxxxxxxyyyyyyyxyz^DAWK-对文件的分拆AWK-变量及系统变量无类型变量不需要先定义不能与系统变量重名在shell中嵌套awk使用shell中的变量num=2awk'{print$"'$num'"}'filenameawk–vnum=2'{print$num}'filenamenum=2Awk–vnum=$num'{print$num}'filenameecho$num|awk….awk可以使用字符串下标,而且不需要连续的数字序列下标(例如,可以定义myarr[1]和myarr[1000],但不定义其它所有元素)。虽然这些都很有用,但在某些情况下,会产生混淆。幸好,awk提供了一些实用功能有助于使数组变得更易于管理。删除数组元素。如果想要删除数组fooarray的元素1,输入:deletefooarray[1]如要查看是否存在某个特定数组元素,可以使用特殊的"in"布尔运算符:if(1infooarray){print"yes!It'sthere."}else{print"no!Can'tfindit."}AWK-数组-哈希AWK-变量及条件与C语言类似AWK-函数gsub(r,s)在整个$0中用s代替rgsub(r,s,t)在整个t中用s替代rindex(s,t)返回s中字符串t的第一位置length(s)返回s长度match(s,r)测试s是否包含匹配r的字符串split(s,a,fs)在fs上将s分成序列asprint(fmt,exp)返回经fmt格式化后的expsub(r,s)用$0中最左边最长的子串代替ssubstr(s,p)返回字符串s中从p开始的后缀部分substr(s,p,n)返回字符串s中从p开始长度为n的后缀部分tolower(String)返回String参数指定的字符串,字符串中每个大写字符将更改为小写。toupper(String)返回String参数指定的字符串,字符串中每个小写字符将更改为大写。处理字符串的函数atan2(y,x)返回y/x的反正切。cos(x)返回x的余弦;x是弧度。sin(x)返回x的正弦;x是弧度。exp(x)返回x幂函数。log(x)返回x的自然对数。sqrt(x)返回x平方根。int(x)返回x的截断至整数的值。rand()返回任意数字n,其中0<=n<1。srand([Expr])将rand函数的种子值设置为Expr参数的值,或如果省略Expr参数则使用某天的时间。返回先前的种子值。数学函数awk'BEGIN{b=system("ls-al");printb;}'awk'BEGIN{print"Enteryourname:";getlinename;printname;}'awk'BEGIN{while(getline<"/etc/passwd"){print$0;};close("/etc/passwd");}'其他AWK-格式化输出AWK-自定义函数function关键字AWK-IF$1~/abc/等价于if($1~/abc/)do...while示例{count=1do{print"Igetprintedatleastoncenomatterwhat"}while(count!=1)}WHILEWhile(条件){action}AWK-WHILE等同于C语言的for循环:
for(initialassignment;comparison;increment){codeblock}示例:for(x=1;x<=4;x++){print"iteration",x}For(iinastr){}AWK-FORx=1while(1){if(x==4){x++
continue完成本次循环next完成所有action,读入下一行数据}print"iteration",xif(x>20){
break中断循环执行exit退出该程序执行}x++}AWK-出口AWK-BEGIN-ENDAWK-程序结构BEGIN{该部分内容在读取数据前执行}{Action每行都执行该部分脚本}END{该部分内容在读取结束后执行}AWK-例子awk‘{x=x+$2}{printx}’inventory累加,每行打印awk‘BEGIN{x=0}{x=x+$2}END{printx}’inventory累加,打印最后结果echo“adf::adf:f”|awk-F‘[:]+’‘{print$2}‘分隔符多样,使用正则表达式描述awk‘{a[$0]++}END{for(iina){if(a[i]>1){printi}}}’filename打印重复行awk‘/AL/{print$3,$2;print$4,$5}’emp_names;分行,执行多个命令awk‘/AL/{print$3,$2}{print$4,$5}’emp_names按条件执行第一个{},无条件执行第二个{}awk‘/AL|IN/’emp_names符合多个模式awk‘/[zZ]hengxh/’filename【】中的某个字符awk-F‘|’‘!a[$1]++{sum+=$3}END{printsum}’filename计算第一列不重复的行的第三个域的值累加awk'{printf("%s%s'"'%s'"'%s\n",$1,$2,$3,$4)}'fileawk‘NR==FNR{a[NR]=$1}NR!=FNR{$5=a[FNR]-$1;print}’file2file1第一个文件内容保存到数组,在第二个文件中处理时使用,FNR读入第二个文件时重置为0,而NR继续awk-F,‘{a[$3]=$0}END{for(iina)printa[i]}’urfile第三列唯一打印本行,不唯一打印最后出现的行AWK-程序例子目录编程概要SHELLAWKPERLPERLPerl(PracticalExtractionandReportLanguage)文字分析报告语言一个功能可以由若干种方式实现是perl的最大特点条条大路通罗马Perl可以写出很晦涩难懂的语句,但能完成很多功能数据——Perl知道的数据控制结构——Perl的控制结构数组——最一般的哈希——特别一点的文件操作——怎样用Perl处理文件子程序——需要时写写强大的正则表达式强大的Perl包PERL-变量scalars标量
用$开头定义的变量,比如$fooscalars数组 用@开头定义的变量,比如@foo,里面的每个元素都是scalarsscalars联合数组,哈希 用%开头定义的变量,比如%foo,里面的每个元素都是scalars文件,大写字母NOTE:
1.Perl变量名称对大小写敏感,$foo和$Foo是两个不同的变量。
2.Perl每种数据结构有专门的命名空间,$foo和@foo是两个不同的变量。
3.显式申明一个变量使用my或者our。4.在程序里使用了usestrict;则变量要先声明;变量不分类型,但分类别PERL-系统变量1.$_$ARG,常常是一个默认变量2.@_@ARG,子例程参数表3.{row.content}$PROGRAM_NAME,本程序的名字4.@ARGV本程序的命令行参数表5.$"$LIST_SEPARATOR,数组内插到双引号字符串中时所用的分隔符,默认为空格6.$,$OFS,或$OUTPUT_FIELD_SEPARATOR,用于print的输出字段分隔符,即一个print语句中用逗号分隔的部分之间用什么分隔,默认为无7.$/$RS,或$INPUT_RECORD_SEPARATOR,输入记录分隔符,改变了readline,<FH>和chomp对于“行”的看法,默认为换行符8.$.$NR,或$INPUT_LINE_NUMBER,最后读取的“行”号(注意行的概念可能被7所改变)9.$|$AUTOFLUSH,或$OUTPUT_AUTOFLUSH,输出缓冲区开关,默认为0,即关10.$$$PID,或$PROCESS_ID,本脚本的进程号(PID)11.$!$ERRNO,或$OS_ERROR,上一次系统调用错误值12.$@$EVAL_ERROR,上一次eval操作错误值13.$^I$INPLACE_EDIT,现场编辑的备份文件扩展名14.%ENV当前环境变量PERL-标量操作
在Perl语言中变量的使用不像在C语言中还要事先申明,在使用纯量变量的时候要先加上$这个符号,要注意的是如果指定的纯量变量是一个字符串的话,就要加上“”这个双引号符号了。如果是一个数值的话,就不用加上“”这个符号了。示例:my($Str1,$str2);mystr3;$Strl="www";#将www这个字符串指定给$Strl这个纯量变量;$str2="cgi";#将cgi这个字符串指定给$str2这个纯量变量;$str3=$strl.$str2;#.就是把两个字符串连起来,所以$str3="wwwcgi";$str3=$str1*2;#str3=“wwwwww”$int=5;#将5这个数字指定给$int这个纯量变量;$int=3+2;#此时$int=5;$int=l0;$int++;#此时$int=10+l=11;$int=l0,$int+=5;#此时$int=10+5=15;PERL-数组操作my@array=(1,4,3);数组元素个数增push@array,1,2;unshift@array,1,2;删my$a=pop@array; my$b=shift@array;改查
$number=@array;--3$number=$#array;--2@array=(1,4,3,1,2);$array[3]=1;$array[4]=2;$a=3;@array=(1,4);@array=(2,1,1,4,3);$b=1;@array=(4,3);$array[0]=5;print"$array[0]";foreach(@array)$_foreach$var(@array)$varfor($i=0;$i<=$#array;$i++)$array[$i]Dump\@array数组下标从0开始PERL-数组操作@namel=(“tom”,“mary”);#将“tom”,“mary”这两个字符串指定给数组@name1@name2=@name1; #此时的@name2=("tom","mary")@pame3=("john",@name1);#此时的(name3=("john","tom","mary")($one,@name4)=@name3; #此时的$one="john",而@name4=("tom"'"mary")@namel=0; #此时@name1为一个空数组排序 my@array=(1,4,3);按ASCII排序
my@new=sort@array;按数值(由小到大)
my@new=sort{$a<=>$b}@array;按数值(由大到小)
my@new=reversesort{$a<=>$b}@array;PERL-哈希数组操作%name=('gene1'=>2838,'gene2'=>2344)key键gene1;value值2838哈希长度$length=keys%name;添加或修改元素$name{'gene3'}=7836;访问哈希$b=$name{'gene1'}删除元素delete$name{'gene3'}判断某个元素是否存在exists$name{'gene3'}访问整个哈希foreach或while等printmy@k=keys%name;
printmy@v=values%name;$name->{‘gene3’}PERL-文件操作通过句柄操作大写(例如:INOUTFILE)open(IN,"<","Input_file");$ate=<IN>;#按行@ate=<IN>;#全部open(OUT,">","OUT_file");printOUT"AllisOK!\n";Perl中以下句柄是默认的:常用的:STDINSTDOUTSTDERRARGVperldocperlvar:查看关于perl内部变量的说明,包括以上句柄@ate=<IN>;少用。如果文件很大,那么程序消耗的内存就会很大。通过句柄OUT把要写入文件里的信息和文件联系起来。使用print函数。PERL-函数进程处理函数eval、system等,if(eval($stmp))数学函数字符串处理函数标量转换函数数组和列表函数哈希函数时间函数PERL-自定义函数Perl没有指针,但引用,具有指针的作用,比如通过引用哈希数组,可以在函数内部把该数组值变化后带出来定义
subsubroutine {
statements;
}调用
&subname;
subname;
dosubname;返回值return(retval);#retval可以为列表Subname(@sarry)Subname(\@sarry)如果调用的时候传递了参数则所有的参数存放在数组@_里面,$_[0],$_[1]…分别对应第一、第二个参数。PERL-比较判断StringOperationArithmeticltlessthan<gtgreaterthan>eqequalto==lelessthanorequalto<=gegreaterthanorequalto>=nenotequalto!=cmpcompare,return1,0,-1<=>OperatorOperation||,orlogicalor&&,andlogicaland!,notlogicalnotxorlogicalxorPERL-IF条件判断
if(<expression>){ <statement_block_1>}elsif
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外贸营销职业大赛理论练习试题
- 烟感报警合同范本
- 2025年河南地矿职业学院单招职业倾向性测试题库必考题
- 学徒合同范本
- 幼儿园迎新年活动方案策划范文
- 幼儿园小班六一儿童节亲子游园活动方案范文
- 养猪出租合同范本
- 科技助力绿色酒店建筑的节能减排
- 武汉购房合同装修合同范本
- 粉尘回收合同范本
- 电梯控制技术PPT完整全套教学课件
- 甲状腺旁腺分泌的激素及功能
- 中央财政成品油价格调整对渔业补助资金项目实施方案
- PFMEA模板完整版文档
- 论生产安全对于家庭的重要性
- 风力发电变桨系统外文翻译
- 教学能力比赛决赛 《英语》教案
- ECMO IABP完整版可编辑
- 离婚纠纷证据清单
- 【高考作文指导】用思辨来写现象类作文(共39张PPT)
- GB/T 4513-2000不定形耐火材料分类
评论
0/150
提交评论