shell命令介绍.doc_第1页
shell命令介绍.doc_第2页
shell命令介绍.doc_第3页
shell命令介绍.doc_第4页
shell命令介绍.doc_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

在shell命令或编程中,可以用AWK强大的的文本处理能力。如果要格式化报文或从一个大的文本文件中抽取数据包,那么awk可完成这些任务。awk是一种解释的编程语言。awk也是shell过滤工具中最难掌握的。awk是一种自解释的编程语言。结合awk和sed和grep,将会使awk编程更加容易。awk语言最基本的功能是在文件或字符串中基于指定的规则浏览和抽取信息。有三种方式可调用awk.命令行方式。.将所有的awk命令插入一个文件,并利用chmod使awk文件成为执行。.将所有的awk命令插入一个单独文件,然后调用。以下简单介绍awk的各种方式,详细请查看相关另外文档在awk中有四种概念。1.抽取域2.匹配正则表达式3.比较域4.向awk传递参数以下简单介绍:1).保存awk输出: #awk print $0 myfilenewfile2).使用tee,在输出到文件的同时输出到屏幕(利用管道|) #awk print $0 myfile |tee newfile3).打印报告头,#awk BEGIN print hello,this is Titlen-print $0 newfile4).打印信息尾.#awk BEGINprint $0 END end of file. myfile5).匹配,如下若在myfile第二列中带有BROWN,则打印信息 #awk if ($2/BROWN/) print $0 myfile6).精确匹配,同上,只是将改为=7).不匹配,有时要浏览信息并抽取不匹配操作的记录,与相反的符号是!,如下#awk $0 !/BROWN/ myfile8).比较如小于: #awk if ($1$2) print $1 myfile9).设置大小写 #awk Ggreen/ myfile10).任意字符,表达式/.a/意为前三个字符是任意字符 #awk $1/.a/ myfile11).或关系匹配,#awk $0/(YELLOW | RED)/ myfile12).与:& ,或:|13).awk内置变量. 要快速查看记录个数,应使用NR,如:#awk END print NR myfile .以下使用NF变量显示每一条读记录中有多少个域,并在END部份 打印输入文件名。#awk print NR,NF,$0 END print FILENAME myfile. 判断并输出 . #awk if(NR0 & $4/BROWN/) print $0 myfile14).可以设置输入域到域变量名。15).域值比较操作。 1.在BEGIN中给变量名赋值。通常在BEGIN部分赋值是很有益的,可以在awk表达式进行改动时减少很大麻烦. 2.在关系操作中使用实际数值,使用关系操作时必须用括号括起来.#awk if($627) print $0 myfile#awk BEGIN BASELINE=27if ($6BASELINE) print $6 myfile 17).修改数据域取值当在awk中修改任何域时,重要的一点是实际的文件可修改,改动的是cache中的awk复本,awk会在变量NR或NF中反映出修改的痕迹。#awk if($1=M.TANS)$6=$6-1;print $6 myfile18).修改文本域#awk if($1=J.Troll)($1=J.L.Troll);print $1 myfile19).只显示修改记录#awk if($1=J.Troll)$1=J.L.Troll;print $1 myfile20).创建新的输出域在awk中处理数据时,基于各域进行计算的创建新域是个好的习惯。如下示例:#awk BEGINprint Name Scoretif($6 wow使用这种方法,显示屏上不会显示输出结果。直接输出到文件。使用tee命令,在输出文件的同时,输出到屏幕$ awk print $0 grade.txt | tee delete_me_and_die(3) 使和标准输入使用awk脚本输入文件格式: $ belts.awk grade_student.txt $ belts.awk grade2.txt $ grade2.txt | belts.awk(4) 打印所有记录$ awk print $0 grade.txt(5) 打印单独记录$ awk print $1,$4 grade.txt(6) 打印报告头域间使用t进行划分。下划线使用n强迫启动新行$ awk BEGIN print Name Beltn- print $1t$4 grade.txt(7) 打印信息尾使用END语句$ awk BEGIN print Namen- print $1 END end-of-report grade.txt 2.5 条件操作符(1) 匹配:$ awk if ($4/Brown/) print $0 grade.txt如果在文本中查询字符串Brown,使用/Brown/$ awk $0 /Brown/ grade.txt(2) 精确匹配$ awk $3 = 48 print $0 grade.txt$ awk if ($3=48) print $0 grade.txt(3) 不匹配$ awk $0 ! /Brown/ grade.txt$ awk if($4 ! /Brown/) print $0 grade.txt精确不匹配$ awk $4 != Brwon-2 print $0 grade.txt(4) 小于$ awk if ($6 $7) print $0 $1 Try better at the next comp grade.txt(5) 小于等于$ awk if ($6 $7) print $1 grade.txt(7) 设置大小写$ awk /Ggreen/ grade.txt(8) 任意字符抽取名字,其记录第一域的第四个字符是a,使用句点.。表达式/.a/意为行首前三个字符任意,第四个是a,尖角符号代表行首。$ awk $1 /.a/ grade.txt(9) 或关系匹配为抽取级别为yellow或brown的记录,使用竖线符|。意为匹配两边模式之一。注意,使用竖线符时,语句必须用圆括号括起来。$ awk $0/(Yellow|Brown)/ grade.txt(10) 行首$ awk /48/ input-file(11) AND& 意味着两边匹配均为真$ awk if ($1 = P.Bunny & $4 = Yellow) print $0 grade.txt(12) OR$ awk if ($4 = Yellow | $4 /Brown/) print $0 grade.txt 2.6 awk内置变量 最常用的一些变量-ARGC 命令行参数个数ARGV 命令行参数排列ENVIRON 支持队列中系统环境变量的使用FILENAME awk浏览的文件名FNR 浏览文件的记录数FS 设置输入域分隔符,等价于命令行-F选项NF 浏览记录的域个数NR 已读的记录数OFS 输出域分隔符ORS 输出记录分隔符RS 控制记录分隔符- 2.7 NF、NR和FILENAMENR代表记录处数$ awk END print NR grade.txt$ 5打印所有学生的记录,并带有其记录号,并在END部分打印输入文件名NF显示一条记录中有几个域$ awk print NF,NR,$0ENDprint FILENAME grade.txt在从文件中抽取信息时,先检查文件中是否有记录。使用AND实现$ awk if (NR 0 & $4/Brown/) print $0 grade.txtNF的强大功能是将变量$PWD的返回值传入awk并显示其目录。这里需要指定域分隔符$ pwd/usr/local/etc$ echo $PWD | awk -F/ print $NF另一个例子是显示文件名:$ echo /usr/local/etc/rc.sybase | awk -F/ print $NFrc.sybase 2.8 awk操作符awk使用操作符,基本表达式可以划分为数字型、字符串型、变量型、域及数组元素,-= += *= /= %= = 赋值操作符? 条件表达操作符| & ! 并、与、非 ! 匹配操作符,包括匹配与不匹配 关系操作符+ - * / % 算术操作符+ - 前缀和后缀-(1)设置输入域到域变量名一般的变量名设置方式为name = $n,这里name为调用的域变量名,n为实际域号。例如,设置学生域名为name,级别域名为belt,操作为name = $1; belts = $4。注意分号,它分隔awk命令。$ awk name = $1; belts = $4; if(belts /Yellow/) print name is belt belts grade.txt$ P.Bunny is belt Yellow (2) 域值比较操作有两种方式测试一数值域是否小于另一数值域1)在BEGIN中给变量名赋值。2)在关系操作中使用实际数值。查询所有比赛中得分在27点的学生$ awk if ($6 27) print $0 grade.txtJ.Lulu 06/99 48317 green 9 24 26J.Troll 07/99 4842 Brown-3 12 26 26使用BEGIN$ awk BEGIN BASELINE=27 if ($6 BASELINE) print $0 grade.txt (3) 修改数值域取值当在awk中修改任何域时,修改的只是缓存里的awk复本。awk会在变量NR和NF变量中反映出修改痕迹。$1=$1+5,会将域1数值加5,但要确保赋值域其子集为数值型。修改M.Tansley的目前级别分域,awk if ($1 = M.Tansley) $6=$6-1; print $1, $6, $7 grade.txt (4) 修改文本域修改文本域即对其重新赋值。需要做的就是赋给一个新的字符串。$ awk if ($1 = J.Troll) ($1 = J.L.Troll); print $1 grade.txt (5) 只显示修改记录在模式后面使用花括号将只打印修改部分。取得模式,再根据模式结果实施操作。$ awk if ($1 = J.Troll) $1 = J.L.Troll; print $1 grade.txt (6) 创建新的输出域如创建一个基于其他域的加法新域$4 = $2 + $3,假定记录包含3上域,则域4为新建域。在文件grade.txt中创建新域8保存域目前级别分与域域最高级别分的减法值。表达式为$8 = $7 - $6,语法首先测试域目前级别分小于域最高组别分。$ awk BEGIN print Namet Difference if ($6 $7) $8 = $7 - $6; print$1, $8 grade.txt 可以创建新域,赋给更有意义的变量名$ awk BEGIN print Namet Difference if ($6 $7) diff = $7 - $6; print$1, diff grade.txt (7) 增加列值为增加列数或进行运行结果统计,使用符号 +=。增加的结果赋给符号左边变量值,增加到变量的域在符号右边。例如将$1加入变量total,表达式为total+=$1。将所有学生的目前级别分加在一起,方法是tot+=$6,tot即为awk浏览的整个文件的域6结果总和。$ awk (tot+=$6); END print Club student total points : tot grade.txtClub student total points : 155 (8) 文件长度相加在目录中查看文件时,快速查看所有文件的长度及其总和,但要排除子目录。使用ls -l,然后管道输出到awk$ ls -l | awk /d/ print $9t$5 tot+=$5 END print total KB : totdata.f 193grade.txt 179grepstring 7local.cshrc 136local.login 157file 174results.txt 2129wow 179total KB : 4690 (9) 内置的字符串函数 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的后缀部分-gsub: index:$ awk BEGIN print index(Bunny, ny) grade.txt4 length:$ awk $1 = J.Troll print length($1) $1 grade.txt7 J.Troll$ awk BEGINprint length(A FEW GOOD MEN)14 match:如果不存在,返回0 split返回字符串数组元素个数。$ awk BEGIN print split(123#456#678, myarray, #)3 sub使用sub发现并替换模式的第一次出现位置。字符串STR包含poped popo pill,执行下列sub命令sub(/op/, op, STR)。结果 pOPed pope pill$ awk $1 = L.Tansley print substr($1, 1, 5) grade.txtL.Tan substr:它按照起始位置及长度返回字符串的一部分。$ awk $1 = L.Tansley print substr($1, 1, 5) grade.txtL.Tansubstr的另一种形式是返回字符串后缀或指定位置后面的字符$ awk print substr($1, 3) grade.txt在BEGIN部分定义字符串,在END部分返回从第t个字符开始抽取的子串。$ awk BEGIN STR=A FEW GOOD MEN END print substr(STR, 7) grade.txtGOOD MEN 从shell中向awk传入字符串:通过管道把字符串传入awk$ echo Stand-by | awk print length($0)8设置文件名为一变量,管道输出到awk,返回不带扩展名的文件名$ STR=mydoc.txt$ echo $STR | awk print substr($STR,1,5)mydoc (10)字符串屏蔽序列使用字符串或正则表达式时,有时需要在输出中加入一新行或查询一元字符。 awk中使用的屏蔽序列-b 退格键 t tab键f 走纸换页 ddd 八进制值n 新行 c 任意其他特殊字符,例如为返斜线符号r 回车键 -打印May Day,中间夹tab键,后跟两个新行,再打印May Day,这次使用八进制数$ awk BEGINprint MaytDaynnMayt104141171 (11) awk输出函数printf awk printf修饰符- - 左对齐 Width 域的步长,用0表示0步长 .prec 最大字符串长度,或小数点右边的位数- awk printf格式- %c ASCII字符 %d 整数 %e 浮点数,科学记数法 %f 浮点数,例如(123.44) %g awk决定使用哪种浮点数转换e或者f %o 八进制数 %s 字符串 %x 十六进制数- 字符转换观察ASCII码中65的等价值。管道输出65到awk。$ echo 65 | awk printf %cn, $0A当然也可以按同样方式使用awk得到同样结果$ awk BEGIN printf %cn, 65A所有的字符转换都一样,下面的例子表示进行浮点数转换后999的输出结果。整数传入后被加了小数点。$ awk BEGIN printf %fn, 999 格式化输出打印所有的学生名字和序列号,要求名字左对齐,15个字符长度,后跟序列号。注意n换行符放在最后一个指示符后面。输出将自动分成两列。$ awk printf %-15s %sn, $1, $3 grade.tx

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论