《第4章SHell编程(续).pdf》由会员分享,可在线阅读,更多相关《第4章SHell编程(续).pdf(9页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638 第第 4 章章 Shell 编程编程(续)(续)教学内容:教学内容:Shell 置换和引用 文本过滤 awk 教学目标:教学目标:熟悉 shelll 置换和引用 掌握 awk 和置换命令 教学重点:教学重点:awk sed 教学难点:教学难点:awk 一一 shell 置换和引用置换和引用 1 什么是置换和引用什么是置换和引用 在 shell 中具有很多特殊意义的字符(*、?、等),shell 将包含元字符的字符串根据其意义转换成新字符串的过程称为置换;关闭
2、 shell 对特殊字符含义的解析处理被称为引用。2 Shell 置换的类型置换的类型 (1)文件名置换 元字符-*匹配所有字符-?匹配所有单个字符-匹配括弧内的字符-!匹配除括弧内的其他字符 实例-#ls abc*-#ls?abc-#ls abc*-#ls !a*(2)变量置换$varname 和$varname 置换变量的值,引用指定变量名的值$varname:+value 判断 varname 变量是否设置,如果设置了,则显示 value,否则显示空$varname:?value 如果变量 varname 变量未设置/为空,则显示错误信息 value$varname:-value 如果变
3、量 varname 变量未设置/为空,则显示 value$varname:=value 如果变量 varname 变量未设置/为穿,则显示 value,并将 value值赋给 varname 变量(3)命令置换 使用命令,置换命令的结果。如 cat ls/etc/grub.conf 使用$(命令)方式置换命令的结果。如 cat$(ls/etc/grub.conf)红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638(4)运算式置换 使用$(算术表达式)置换表达式的结果。如 a=$(1+1)使用 declare/
4、let 定义整型变量和给变量赋值。如 let a=5+5 3 Shell 引用引用 使用“”取消其后面的特殊字符的含义,特殊字符有*?“”$;&()|!#;如“abc*”.使用引用所有被括起来的字符,如 echo$a*使用“”引用所有除$和以外的字符 二二 文本过滤文本过滤 1 什么是文本过滤什么是文本过滤 文本过滤指的是提取指定文件中的部分内容或替换指定文本文件中的字符串 2 文本过滤的命令文本过滤的命令(1)head 功能:功能:输出文件头部 n 行 格式:格式:head -n 文件名 实例:实例:#head -3 /etc/passwd(2)tail 功能:功能:输出文件尾部 n 行或监
5、控文件 格式:格式:tail +n/-n/-f 文件 实例:实例:#tail 3 /etc/passwd#tail+3 /etc/passwd#tail f /etc/passwd(3)uniq 功能功能:检查及删除文本文件中重复出现的行列 格式格式:uniq 选项 输入文件输出文件 选项选项:-c 在每列旁边显示该行重复出现的次数。-d 仅显示重复出现的行列。-f 忽略比较指定的栏位。-s 忽略比较指定的字符。-u 仅显示出现一次的行。-w 指定要比较的字符。实例实例:#uniq -u /root/aa#uniq -dc/root/aa(4)sort 功能:功能:对文件进行排序/合并 格式:
6、格式:sort 选项 文件名 选项选项:-d:按字典顺序(只对空格/字母/数字)-f:忽略大小写 红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638-t:指定分隔符-r 反向-n 按数字大小显示-c 只检查是否有序,不实际排序-u 消除重复行 实例实例:#sort -r /etc/passwd#sort +1-2 /etc/passwd(5)grep 功能:功能:在文本文件中查找匹配的字符串 格式:格式:#grep 参数“字符串”文件 参数:参数:-?同时显示匹配行上下的?行-b 在匹配行前面打印该行所在的块
7、号-c 只打印匹配的行数,不显示匹配的内容-f File 从文件中提取模板,空文件中包含 0 个模板,所以什么都不匹配-h 当搜索多个文件时,不显示匹配文件名前缀-I 忽略大小写差别-q 取消显示,只返回退出状态。0 则表示找到了匹配的行-l 打印匹配模板的文件清单-L 打印不匹配模板的文件清单-n 在匹配的行前面打印行号-s 不显示关于不存在或者无法读取文件的错误信息-v 反检索,只显示不匹配的行-w 如果被引用,就把表达式做为一个单词搜索 正则表达式元字符:正则表达式元字符:锚定行的开始 如:grep匹配所有以 grep 开头的行$锚定行的结束 如:grep$匹配所有以 grep 结尾的行
8、.匹配一个非换行符的字符 如:gr.p匹配 gr 后接一个任意字符,然后是 p*匹配零个或多个先前字符 如:*grep匹配所有一个或多个空格后紧跟 grep 的行。.*一起用代表任意字符 匹配一个指定范围内的字符,如Ggrep匹配 Grep 和 grep 匹配一个不在指定范围内的字符,如:A-FH-Zrep匹配不包含 A-R 和 T-Z 的一个字母开头,紧跟 rep 的行 (.(.)标记匹配字符,如(love),love 被标记为 1 锚定单词的开始,如:锚定单词的结束,如:grep匹配包含以 grep 结尾的单词的行 x x mm 重复字符 x,m 次,如:05匹配包含 5 个 o 的行 x
9、 x m,m,重复字符 x,至少 m 次,如:o5,匹配至少有 5 个 o 的行 x x m,nm,n 重复字符 x,至少 m 次,不多于 n 次,如:o5,10匹配 5-10 个 o 的行 实例:实例:#ls-l|grep a 通过管道过滤 ls-l 输出的内容,只显示以 a 开头的行。#grep test d*显示所有以 d 开头的文件中包含 test 的行。#grep test aa bb cc 显示在 aa,bb,cc 文件中匹配 test 的行。#grep a-z5 aa 显示所有包含每个字符串有 5 个连续小写字符的字符串的行。#grep w(es)t.*1 aa 如果 west
10、被匹配,则 es 就被存储到内存中,并标记为 1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个 es(1),找到就显示该行。如果用 egrep 或 grep-E,就不用号进行转义,直接写成w(es)t.*1就可以了。(6)sed 功能:功能:Sed(a stream editor)是流线型、非交互式编辑器。它允许你执行与 vi 编辑器里一样的编辑任务。Sed 程序不是与编辑器交互式工作的,而是让你在命令行里敲入编辑的命令,给文件命名,然后在屏幕上查看命令输出结果。格式:格式:sed 选项 sed 子命令 输入文件 输出文件 子命令:子命令:p 打印匹配行=显示文件行号 a 在定位行号
11、后附加新文本信息 i 在定位行号前插入新文本信息 d 删除定位行 c 用新文本替换定位文本 s 使用替换模式替换相应模式 r 从另一个文件中读文本 w 写文本到一个文件 q 第一个模式匹配完成后推出或立即推出 在定位行执行的命令组 n 从另一个文件中读文本下一行,并附加在下一行 y 传送字符 n 延续到下一输入行;允许跨行的模式匹配语句 实例:实例:1 1 打印:打印:p p 命令命令 红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638#sed/north/p datafile 默认输出所有行,找到 nort
12、h 的行重复打印#sed n/north/p datafile 禁止默认输出,只打印找到 north 的行#sed-n/west/,/east/p datafile 打印在 west 和 east 之间的模式范围内所有行。2 2 删除:删除:d d 命令命令#sed 3d datafile 删除第三行,其余行输出到屏幕#sed 3,$d datafile 从第 3 行到最后一行都删除,将剩余部分输出到屏幕#sed/north/d datafile 将含有 north 的行删除,其余输出到屏幕 3 3 替换:替换:s s 命令命令#sed s/west/north/g datafile 找到 d
13、atafile 中的所有 west 并替换成 north,将替换后的内容输出到屏幕。#sed-n s/Hemenway/Jones/gp datafile 所有的 Hemenway 所在的位置都用 Jones 来取代,而且只有改变的行被打印。#sed-n s/(Mar)got/1ianne/p datafile 模式 Mar 被封装在括弧里且在一个专用寄存器里存为标记 1。在替换串里它将被引用做1。然后用 Marianne 替代 Margot。4 4 多次编辑多次编辑 -e e 选项选项#sed-e 1,3d-e s/Hemenway/Jones/datafile 5 5 从文件中读取:从文件
14、中读取:r r 命令命令#sed/Suan/r newfile datafile r 命令从 newfile 中读取内容,将内容输出到 Suan 的后面。6 6 写入文件:写入文件:w w 命令命令#sed-n/north/w newfile datafile w 命令把指定的行写入到一个文件。7 7 添加:添加:a a 命令命令#sed/north/a THE NORTH SALES DISTRICT HAS MOVED 插入:插入:i i 命令命令#sed/north/i THE NORTH SALES DISTRICT HAS MOVED datafile 在符合模式的行前面插入内容。其
15、余和 a命令相同。9 9 下一个:下一个:n n 命令命令 红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638#sed/eastern/n;s/AM/Archie/;datafile 1 10 0 变换:变换:y y 命令命令#sed 1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/datafile 将对应字母进行转换。1111 退出:退出:q q 命令命令#sed 5q datafile 在打印了 5 行之后,用 q 命令退出 sed 程序。三三 A Awkwk
16、 1.1.什么是什么是 awkawk Awk 是一种程序语言,对文本文件的处理具有很强的功能,如修改、比较、提取、打印等。awk 语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。awk 抽取信息后,才能进行其他文本操作。完整的 awk 脚本通常用来格式化文本文件中的信息。2.2.如何执行如何执行 awkawk 程序程序 Awk 程序可以直接在命令行中执行,也可以存放在文件然后在命令行调用。方法一:直接在命令行中执行方法一:直接在命令行中执行#gawk program input-file1 input-file2 方法二:调用方法二:调用 awkawk 程序文件程序文件#gawk
17、 f program-file input-file1 input-file2 任何 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 完成文本浏览动作后打印输出文本总数和结尾状态标志。如
18、果不特别指明模式,a w k 总是匹配或打印行数。实际动作在大括号 内指明。动作大多数用来打印,但是还有些更长的代码诸如 i f 和循环语句及循环退出结构。如果不指明采取动作,a w k 将打印出所有浏览出来的记录。3.3.认识文件中的记录和域认识文件中的记录和域 域 1 分隔符 域 2 分隔符 域 3 分隔符 域 4 abc#0 2/9 9#4 8#fine 默认文件中以换行符结束的行称为记录,awk 中可以指定记录分隔符,也可以用$0 引用整个记录 记录是由若干个域构成的,域之间由指定的分隔符隔开,默认分隔符为空格。可以用$1$n 引用记录中的各个域 4.4.正则表达式和运行算符正则表达式
19、和运行算符 (1)算术运算符:+-*、/%(取余)(乘方)红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638(2)关系运算符:=!=(匹配)!(不匹配)(3)逻辑运算符:&|!(4)赋值运算符:=+=-=*=/=%=(5)自增、自减运算符:+-(6)数组引用:in 5.5.awkawk 变量变量和数组和数组 (1)awk 变量分为数值型和字符型,用户引用变量时即定义了变量,变量类型由变量内容决定,引用变量时不用加$。(2)awk 内置变量如下 ARGC 命令行参数的数目。ARGIND 命令行中当前文件的位置(
20、从 0 开始算)。ARGV 包含命令行参数的数组。CONVFMT 数字转换格式(默认值为%.6g)ENVIRON 环境变量关联数组。ERRNO 最后一个系统错误的描述。FIELDWIDTHS 字段宽度列表(用空格键分隔)。FNR 同 NR,但相对于当前文件。FS 字段分隔符(默认是任何空格)。IGNORECASE 如果为真,则进行忽略大小写的匹配。NF 当前记录中的字段数。NR 当前记录数。OFMT 数字的输出格式(默认值是%.6g)。OFS 输出字段分隔符(默认值是一个空格)。ORS 输出记录分隔符(默认值是一个换行符)。RLENGTH 由 match 函数所匹配的字符串的长度。RS 记录分
21、隔符(默认是一个换行符)。RSTART 由 match 函数所匹配的字符串的第一个位置。SUBSEP 数组下标分隔符(默认值是034)。(3)awk 数组 awk 允许使用数组,数组的格式如下。Varname下标 awk 数据组的下标可以数字(从 1 开始)和字符表示,name1、namea。6 6awkawk 输出命令输出命令 输出命令是 awk 最常用的操作命令,它包含 print 和 printf 两种方式。(1)print#awk print$0 /etc/passwd(2)printf(格式化输出)格式:printf“输出格式”,表达式 实例:#awk printf“user nam
22、e:%s”,%1/etc/passwd 注:print 和 printf 语句中常用的转义字符和格式符-转义字符 t table 制表位 红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638 n 换行符 表示“”b 表示退格-格式符%c 输出单个字符%d%i 输出整数%e 按科学计数法输出小数%f 输出浮点数%s 输出字符串%输出%7 7A Awkwk 控制语句控制语句 (1)if(1)if 语句语句 功能:实现条件分支 格式:if(expr)action1 else action2 实例:#awk -F:if
23、 ($3=0)print$0/etc/passwd(2)(2)forfor 语句语句 功能:实现循环执行 格式:for(init_cntr;test_cntr;incr_cntr)action 实例:#awk for(i=1;i5;i+)printf“%s”,$i;printf“:”print“n”(3)(3)whilewhile 语句语句 功能:实现循环执行 格式:while(expr)action 实例:#awk i=1;while(i5)printf“%s”,$i;printf“:”print“n”注:还有一种 dowhile 形式(4)(4)breabreak k 和和 continu
24、econtinue 退出循环和进行下一次循环(5)(5)exitexit 退出 awk(6)(6)nextnext 跳过后面内容,读取下一行 8.awk8.awk 函数函数 length(string)求串 string 中的字符个数 index(search,string)返回 string 中 search 串的位置 match(string,reg)返回常规表达式 reg 匹配的 string 中的位置 sub(reg,string,target)第一次当常规表达式 reg 匹配,替换 target 串中的字符串 substr(string,position,len)返回一个以 posi
25、tion 开始 len 个字符的子串 红旗红旗 Linux 软件技术学院软件技术学院-RCE 课程之课程之系统管理系统管理 邮 电:z_an_ 电 话:13856036638 totower(string)返回 string 中对应的小写字符 toupper(string)返回 string 中对应的大写字符 split(string,store,delim)根据分界符 delim,分解 string 为 store 的数组元素 sprintf(format,variable)返回一个包含基于 format 的格式化数据,variables 是要放到串中的数据 strftime(format,
26、timestamp)返回一个基于 format 的日期或者时间串,timestmp 是systime()函数返回的时间 srand(x)初始化随机数发生器。如果忽略 x,则使用 system()system()返回自 1970 年 1 月 1 日以来经过的时间(按秒计算)rand()0-1 之间的随机数 9 9A Awkwk 脚本实例脚本实例#vi /awk/st1.awk#!/bin/awk-f#to call:du|duawk.awk#prints file/direcs in bytes and blocks BEGIN OFS=t;print name tt,bytes,blocksn print=print$2,tt,$1*512,$1#chmod a+x/awk/st1.awk#du|awk/st1.awk