




已阅读5页,还剩14页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
LINUX的awk和sed的常用用法awk的用法a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息调用awk有三种方式调用a w k,第一种是命令行方式,如: awk F : commands input-files第二种方法是将所有a w k命令插入一个文件,并使a w k程序可执行,然后用a w k命令作为脚本的首行,以便通过键入脚本名称来调用它。第三种方式是将所有的a w k命令插入一个单独文件,然后调用:awk f awk-script-file input-filesawk脚本模式和动作在命令中调用a w k时,a w k脚本由各种操作和模式组成。模式包括两个特殊字段B E G I N和E N D。使用B E G I N语句设置计数和打印头。B E G I N语句使用在任何文本浏览动作之前。E N D语句用来在a w k完成文本浏览动作后打印输出文本总数和结尾状态标志。实际动作在大括号 内指明。域和记录$ 0,意即所有域确保整个a w k命令用单引号括起来。确保命令内所有引号成对出现。确保用花括号括起动作语句,用圆括号括起条件语句。awk中的正则表达式+使用+匹配一个或多个字符。?匹配模式出现频率。例如使用/X Y?Z/匹配X Y Z或Y Z。awk if($4/Brown/) print $0 tab2等效于awk $0 /Brown/ tab2内置变量awk print NF,NR,$0ENDprint FILENAME tab1NF域的总数NR已经读取的记录数FILENAMEawk if(NR0 & $2/JLNQ/) print $0ENDprint FILENAME tab1显示文件名echo /app/oracle/ora_dmp/lisx/tab1 | awk -F/ print $NF定义域名awk owner=$2;number=$3;if(owner/SYSADMIN/ & number!=12101)print $0ENDprint FILENAME tab1awk BEGINNUM1=7if($1=NUM1) print $0ENDprint FILENAME tab1当在a w k中修改任何域时,重要的一点是要记住实际输入文件是不可修改的,修改的只是保存在缓存里的a w k复本awk BEGINNUM1=7if($1=NUM1) print $1+2,$2,$3+100ENDprint FILENAME tab1只打印修改部分:用awk BEGINNUM1=7if($1=NUM1)$2=ORACLE; print $0ENDprint filename:FILENAME tab1可以创建新的域awk BEGINNUM1=7;print COL1tCOL2tCOL3tCOL4”if($1=NUM1)$4=$1*$3;$2=ORACLE; print $0ENDprint filename:FILENAME tab1打印总数:awk BEGINNUM1=7;print COL1tCOL2tCOL3tCOL4if($180 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中的销售金额(假设销售金额在记录的第三字段):$awkBEGIN FS=:;print 统计销售金额;total=0print $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(表达式)语句1else语句2格式中语句1可以是多个语句,如果你为了方便awk判断也方便你自已阅读,你最好将多个语句用括起来。awk分枝结构允许嵌套,其格式为:if(表达式1)if(表达式2)语句1else语句2语句3else if(表达式3)语句4else语句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参数是当前页的页号。这个函数的功能是打印(显示)出当前文件的文件名,和当前页的页号。完成这个功能后,这个函数将返回下一页的页号。nawkBEGINpageno=1;file=FILENAMEpageno=print_header(file,pageno);#调用函数print_headerprintf(当前页页号是:%dn,pageno);#定义函数print_headerfunction print_header(FileName,PageNum)printf(%s %dn,FileName,PageNum); PageNum+;return PageNUm; myfile执行这个程序将显示如下内容:myfile 1当前页页号是:2awk高级输入输出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被增值。用户也可以使用getlinedatafile或printf(hello word!n)datafile5.输出到一个命令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%st撰写者%sn,FILENAME,name);.END. myfile.2.将shell命令的执行结果送给awk处理作为信息传送的一种方法,我们可以将一条shell命令的结果通过管道线(|)传递给awk处理:例:示例awk处理shell命令的执行结果$who -u | awk printf(%s正在执行%sn,$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 ttydocat /tmp/$ttydone在这个程序里,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送入打印机打印。附录:1.awk的常规表达式元字符 换码序列 在字符串的开头开始匹配$ 在字符串的结尾开始匹配. 与任何单个字符串匹配ABC 与内的任一字符匹配A-Ca-c 与A-C及a-c范围内的字符匹配(按字母表顺序)ABC 与除内的所有字符以外的任一字符匹配Desk|Chair 与Desk和Chair中的任一个匹配ABCDEF 关联。与A、B、C中的任一字符匹配,且其后要跟D、E、F中的任一个字符。* 与A、B或C中任一个出现0次或多次的字符相匹配+ 与A、B或C中任何一个出现1次或多次的字符相匹配? 与一个空串或A、B或C在任何一个字符相匹配(Blue|Black)berry 合并常规表达式,与Blueberry或Blackberry相匹配2.awk算术运算符运算符 用途-xy x的y次幂x*y 同上x%y 计算x/y的余数(求模)x+y x加yx-y x减yx*y x乘yx/y x除y-y 负y(y的开关符号);也称一目减+y y加1后使用y(前置加)y+ 使用y值后加1(后缀加)-y y减1后使用y(前置减)y- 使用后y减1(后缀减)x=y 将y的值赋给xx+=y 将x+y的值赋给xx-=y 将x-y的值赋给xx*=y 将x*y的值赋给xx/=y 将x/y的值赋给x x%=y 将x%y的值赋给xx=y 将xy的值赋给xx*=y 将x*y的值赋给x3.awk允许的测试:操作符 含义x=y x等于yx!=y x不等于yxy x大于yx=y x大于或等于yx = = = != !xy (字符串连结,xy变成xy)+ -* / %+ -4.awk内置变量(预定义变量)说明:表中v项表示第一个支持变量的工具(下同):A=awk,N=nawk,P=POSIX awk,G=gawkV 变量 含义 缺省值-N ARGC 命令行参数个数G ARGIND 当前被处理文件的ARGV标志符N ARGV 命令行参数数组G CONVFMT 数字转换格式 %.6gP ENVIRON UNIX环境变量N ERRNO UNIX系统错误消息G FIELDWIDTHS 输入字段宽度的空白分隔字符串A FILENAME 当前输入文件的名字P FNR 当前记录数A FS 输入字段分隔符 空格G IGNORECASE 控制大小写敏感0(大小写敏感)A NF 当前记录中的字段个数A NR 已经读出的记录数A OFMT 数字的输出格式 %.6gA OFS 输出字段分隔符 空格A ORS 输出的记录分隔符 新行A RS 输入的记录他隔符 新行N RSTART 被匹配函数匹配的字符串首N RLENGTH 被匹配函数匹配的字符串长度N SUBSEP 下标分隔符 0345.awk的内置函数V 函数 用途或返回值-N gsub(reg,string,target) 每次常规表达式reg匹配时替换target中的stringN index(search,string) 返回string中search串的位置A length(string) 求串string中的字符个数N match(string,reg) 返回常规表达式reg匹配的string中的位置N printf(format,variable) 格式化输出,按format提供的格式输出变量variable。N split(string,store,delim) 根据分界符delim,分解string为store的数组元素N sprintf(format,variable) 返回一个包含基于format的格式化数据,variables是要放到串中的数据G strftime(format,timestamp) 返回一个基于format的日期或者时间串,timestmp是systime()函数返回的时间N sub(reg,string,target) 第一次当常规表达式reg匹配,替换target串中的字符串A substr(string,position,len) 返回一个以position开始len个字符的子串P totower(string) 返回string中对应的小写字符P toupper(string) 返回string中对应的大写字符A atan(x,y) x的余切(弧度)N cos(x) x的余弦(弧度)A exp(x) e的x幂A int(x) x的整数部分A log(x) x的自然对数值N rand() 0-1之间的随机数N sin(x) x的正弦(弧度)A sqrt(x) x的平方根A srand(x) 初始化随机数发生器。如果忽略x,则使用system()G system() 返回自1970年1月1日以来经过的时间(按秒计算)SED用法sed怎样读取数据s e d从文件的一个文本行或从标准输入的几种格式中读取数据,将之拷贝到一个编辑缓冲区,然后读命令行或脚本的第一条命令,并使用这些命令查找模式或定位行号编辑它。重复此过程直到命令结束。调用s e d有三种方式使用s e d命令行格式为:sed 选项 s e d命令 输入文件。记住在命令行使用s e d命令时,实际命令要加单引号。s e d也允许加双引号。使用s e d脚本文件,格式为:sed 选项 -f sed脚本文件 输入文件要使用第一行具有s e d命令解释器的s e d脚本文件,其格式为:s e d脚本文件选项 输入文件使用s e d在文件中定位文本的方式x x为一行号,如1x , y 表示行号范围从x到y,如2,5表示从第2行到第5行/ p a t t e r n /查询包含模式的行。例如/ d i s k /或/a-z/ p a t t e r n / p a t t e r n /查询包含两个模式的行。例如/ d i s k / d i s k s /p a t
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年数字媒体营销师中级考试题库及备考策略指南
- 基于RegTech的金融机构SWOT策略研究-洞察及研究
- 基因组时空表达-洞察及研究
- 铁路业务知识培训课件报道
- 知识付费企业培训内容课件
- 知识产权金融培训会课件
- 知识产权质押专题培训班课件
- 知识产权拟定培训课件
- 知识产权巡回培训课件
- 钩织社团汇报课件
- 《非线性动力学》课程教学大纲
- 【学生生涯规划系列】高一上学期生涯规划讲座课件
- 《工程制图完整》课件
- 焊接工艺要求
- JJF(电子) 31502-2010 静电腕带/脚盘测试仪校准规范-(高清现行)
- 国学武术操太极拳表演活动流程
- DB14∕T 1131-2015 麦茬复播花生栽培技术规程
- 《生产运作与管理》教案(完整版)
- 先张法U型梁施工与管理
- 江苏省五年一贯制专转本《C语言程序设计》模拟试卷试题三(晓庄)
- 高三教学视导方案
评论
0/150
提交评论