unix脚本总结与应用实例 - 图文

更新时间:2024-06-24 19:49:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

19027008.doc Confidentiality level 密级

Huawei Technologies Co. Ltd. 华为技术有限公司 Confidentiality level 密级 Total 83 pages共83页

Unix 脚本编程总结与应用实例

Prepared by

拟制

Reviewed by 评审人 Approved by

批准

Authorized by

签发

陈刚

Date 日期 Date 日期 Date 日期 Date 日期

2003-09-23 yyyy-mm-dd yyyy-mm-dd yyyy-mm-dd

Huawei Technologies Co., Ltd.

华为技术有限公司

All rights reserved 版权所有 侵权必究

All rights reserved 版权所有,侵权必究

Page 1 , Total 83 第1页,共83页

19027008.doc Confidentiality level 密级

Revision Record 修订记录

Date 日期 Revision CR ID Version / Defect 修订 ID 版本 CR号 1.00 1.01 Sec No. 修改 章节 Change Description 修改描述 Author 作者 2003-09-23 2003-10-25 initial 初稿完成 陈刚35626 1. 修正有关IP地址等一些陈刚错误,调整了章节顺序,35626 扩充了内容。 2. 增添了iTELLIN自动安装脚本的一些实例 3. 加入大纲层次和页眉页脚 1. 在六.杂项 中添加了一些例子. ?? revised xxx 修改XXX 1. Xxx 2. Xxx 3. ... 陈刚 ?? Name 作者名 2004-5-24 ?? 1.03 ?? xxx x.x.x; y.y.y yyyy-mm-dd 2.00 Distribution List 分发记录

Copy No. 1 2 3 4 5 Holder's Name & Role 持有者和角色 Issue Date 分发日期 yyyy-mm-dd yyyy-mm-dd yyyy-mm-dd yyyy-mm-dd yyyy-mm-dd All rights reserved 版权所有,侵权必究

Page 2 , Total 83 第2页,共83页

19027008.doc Confidentiality level 密级

Catalog 目 录

Revision Record 修订记录 .................................................................................................................... 2 Catalog 目 录 ................................................................................................................................... 3 Title 标 题:Unix 脚本编程总结与应用实例 ................................................................................. 8 Keywords 关键词: ............................................................................................................................... 8 Abstract 摘 要: ........................................................................................................................... 8 List of abbreviations 缩略语清单: ..................................................................................................... 8 命令格式 .................................................................................................................................................. 9

一.shell与Unix平台 ...................................................................................................................... 9 二.shell基本知识 ...................................................................................................................... 9 三.grep 命令 ............................................................................................................................ 11 四.sed ......................................................................................................................................... 11 五.awk命令 ................................................................................................................................. 11 六.find命令 .............................................................................................................................. 12 七.test命令 .............................................................................................................................. 12 八.expr命令 .............................................................................................................................. 13 九.流程控制语法 ........................................................................................................................ 13

1. if-then-elif-else-fi语句 ................................................................................. 13 4. for语句 .......................................................................................................................... 15 6. while语句 ..................................................................................................................... 16 7. until 语句 ................................................................................................................... 17 8. break及continue ...................................................................................................... 18 9. case 语句 ..................................................................................................................... 18 十.shell脚本调试 .................................................................................................................... 19 实例讲解 ................................................................................................................................................ 21

一.模式匹配 ................................................................................................................................ 21

1.ls显示所有以hosts.开头的文件 ............................................................................... 21 2.ls显示包含x,y,z字符的所有文件 ............................................................................. 21 二.正则表达式 ............................................................................................................................ 21

1.grep匹配/etc/services文件中以ftp字符串开头的哪些文本行....................... 21 2.grep匹配以system文本结尾的行。 .......................................................................... 21 3.grep匹配仅包含一个#字符的行。 .............................................................................. 21 4.grep匹配以或者[abc]开头的行 ..................................................................... 21 5.grep匹配以Ftp或者ftp开头的行 .............................................................................. 21 6.grep匹配F或者f以外的字符 ........................................................................................ 21 7.grep匹配除大写字符以外的字符 ................................................................................ 21 8.grep匹配以ftp或telnet开头的文本行 ................................................................... 21 9.grep匹配以ftp开头,后跟0个或多个-agent的文本行 ......................................... 21 10.grep匹配以ftp开头,后跟1个或多个-agent的文本行 ...................................... 21 11.grep匹配带有数字6,后跟至少3个0的文本行(使用-E启用边界特性) .............. 22 12.grep匹配含有(abc)的文本 ...................................................................................... 22 13.常用正则表达式举例.................................................................................................... 22

All rights reserved 版权所有,侵权必究

Page 3 , Total 83 第3页,共83页

19027008.doc Confidentiality level 密级

14.grep精确匹配:在抽取字符串后加\\>。 ................................................................. 23 15.grep消除大小写:加入-i选项 ................................................................................. 23 16.特殊字符:$ . ? ― * [ ] ^ | \\ + ? ............................................................. 23 17.grep判断变量含有[HOST]字符串 ............................................................................ 23 18.grep判断变量含有[xxx]字符串 .............................................................................. 23 19.grep匹配后缀为c,h,j,s,cpp,hpp的文件 .......................................................... 23 20.使用grep在文件中查找变量 ...................................................................................... 23 21.正则表达式语法 ........................................................................................................... 23 三.sed命令 ................................................................................................................................. 27

1.sed文本的定位方法: ................................................................................................... 27 2.sed编辑命令 ................................................................................................................... 27 3.sed打印文件的第二行 ................................................................................................... 27 4.sed打印文件的第一到三行 ........................................................................................... 28 5.sed打印匹配test的行 ................................................................................................. 28 6.sed打印匹配$的行 ........................................................................................................ 28 7.sed打印最后一行:$是代表最后一行的特殊字符 ..................................................... 28 8.sed脚本文件 ................................................................................................................... 28 9.sed上例中如果将a\\改为i: .......................................................................................28\\ 10.sed上例中如果将a\\改为c: .....................................................................................28\\ 11.sed删除第一行 ............................................................................................................ 28 12.sed删除第一到第三行 ................................................................................................ 28 13.sed删除最后一行 ........................................................................................................ 28 14.sed替换文本 ................................................................................................................ 28 15.sed输出到文件,w选项: .......................................................................................... 28 16.sed从文件读取,r选项: .......................................................................................... 28 17.sed优势: .................................................................................................................... 29 18.sed常见的一行命令集 ................................................................................................ 29 19.sed去掉字串变量前后的空格 .................................................................................... 29 20.sed去除文件count中的前后的空格......................................................................... 29 21.sed提取最后一个目录名和程序名 ............................................................................ 30 22.dirname或参数扩展提取目录名 ............................................................................... 30 23.grep,sed获取文件的扩展名 .................................................................................... 31 24.sed获取第n个匹配的行的行号 .................................................................................. 31 四.awk命令 ................................................................................................................................. 31

1.awk字段分隔符: ........................................................................................................... 32 2.awk匹配模式 ................................................................................................................... 32 3.awk―模式匹配-动作‖ .................................................................................................. 32 4.awk内部变量 ................................................................................................................... 32 5.awk用户定义变量 ........................................................................................................... 33 6.awk算术运算 ................................................................................................................... 33 7.awk高级算符 ................................................................................................................... 33 8.awk内部算术函数 ........................................................................................................... 33 9.awk内置函数 ................................................................................................................... 33

All rights reserved 版权所有,侵权必究

Page 4 , Total 83 第4页,共83页

19027008.doc Confidentiality level 密级

10.awk的自定义函数 ........................................................................................................ 34 11.awk的―下一‖语句:.................................................................................................... 35 12.awk中的字符串相加: .................................................................................................. 35 13.awk的逻辑运算符 ........................................................................................................ 35 14.awk的逻辑与||、逻辑或&& ....................................................................................... 35 15.awk的FS、OFS和ORS使用: ..................................................................................... 35 16.awk的sprintf函数的使用 ........................................................................................ 36 17.awk的重定向,输出到文件: .................................................................................... 36 18.awk删除文件的第一行 ................................................................................................ 36 19.awk删除输入行中特定行的换行字符......................................................................... 36 20.awk获取输入行中,域的最大个数 ............................................................................ 36 21.awk输出一行超过80 个字符的每一行 ...................................................................... 36 22.awk输出至少一个域的所有行。可用来将一个文档里的所有空白行删除 ............. 36 23.awk输出范围在0 到100 之间的7 个随机数 ........................................................... 36 24.awk将所有用户的login名称依照字母的顺序输出 ................................................. 36 25.awk将一个文档的总行数输出 .................................................................................... 36 26.awk输出文档的内容时会在每行的最前面输出行号它的功能与'cat -n' 类似 36 27.awk自定义函数的例子一: 第一个域与第二个域的平方和 .................................... 37 28.awk的split、数组、注释 ........................................................................................ 37 29.awk打印传入字符串的第n个分隔域。 ...................................................................... 37 30.在awk中使用shell中的变量 .................................................................................... 37 31.在某个目录下查找包含特定字符串的文件。返回文件名称 .................................... 39 五.其它命令 ................................................................................................................................ 39

1.eval命令:可用于动态生成和执行代码 ..................................................................... 39 2.exit

n:退出 ........................................................................................................ 40

3.export导出环境变量:................................................................................................ 41 4.shift命令: .................................................................................................................. 41 5.shell的参数扩展: ...................................................................................................... 41 6.<<即时文档 ..................................................................................................................... 42 7.sh调试选项 ..................................................................................................................... 42 8.time命令测试一个程序执行时间 ................................................................................ 42 9.expr命令 ........................................................................................................................ 42 10.if语句判断变量是否为某个值(防止空串) ........................................................... 43 11.nm命令察看一下xxx.o文件中是否有多个相同名字的函数 ................................... 43 12.ps、grep和awk显示属于某个用户的所有进程(并杀死) .................................. 43 13.touch命令 ................................................................................................................... 44 14.touch与make联合使用强制编译 .............................................................................. 44 15.dd命令传送文件 ........................................................................................................... 44 16.talk命令 ...................................................................................................................... 44 17.ps命令........................................................................................................................... 44 18.rm指令........................................................................................................................... 44 19.find命令 ...................................................................................................................... 44 21.rusers命令 ................................................................................................................. 45

All rights reserved 版权所有,侵权必究

Page 5 , Total 83 第5页,共83页

19027008.doc Confidentiality level 密级

22.cal命令 ........................................................................................................................ 45 23.tty命令 ........................................................................................................................ 45 24.banner命令 ................................................................................................................. 45 25.find命令 .......................................................................................................................... 45 26.cut命令 ........................................................................................................................ 45 27.paste命令 ................................................................................................................... 46 28.rm命令 ............................................................................................................................ 47 29.mkdir命令 ....................................................................................................................... 47 30.cat命令 ........................................................................................................................... 48 32.groupadd和mkgroup命令 ............................................................................................... 48 33.ln命令 ............................................................................................................................. 48 34.su命令 ............................................................................................................................. 49 35.setenv命令 ...................................................................................................................... 49 36.repeat命令 ...................................................................................................................... 49 37.getopts命令 ..................................................................................................................... 49 38.sort命令 .......................................................................................................................... 50 38.kill命令和trap命令 ......................................................................................................... 50 39.操作系统和数据库检查(IBM)(一):检查核心参数的配置 ............................. 51 40.操作系统和数据库检查(IBM)(二):检查时区的配置 ..................................... 52 41.操作系统和数据库检查(IBM)(三):检查硬件错误 ......................................... 52 42.操作系统和数据库检查(IBM)(四):检查硬盘错误 ......................................... 52 43.操作系统和数据库检查(IBM)(五):检查交换区的使用情况 ......................... 52 44.操作系统和数据库检查(IBM)(六):检查内存的使用情况 ............................. 52 45.操作系统和数据库检查(IBM)(七):检查系统的运行情况 ............................. 52 46.操作系统和数据库检查(IBM)(八):检查文件系统的使用情况 ..................... 52 47.操作系统和数据库检查(IBM)(九):检查文件系统的属性 ............................. 53 48.操作系统和数据库检查(IBM)(十):HACMP检查 ........................................... 53 49.操作系统和数据库检查(IBM)(十一):检查数据库的DR状态 ........................ 53 50.操作系统和数据库检查(IBM)(十二):检查数据库的运行状态 ..................... 54 51.操作系统和数据库检查(IBM)(十三):数据库检查 ......................................... 55 52.操作系统和数据库检查(IBM)(十四):检查数据库的运行日志 ..................... 55 53.fsck命令 ......................................................................................................................... 55 54.useradd和mkuser命令 ................................................................................................... 56 54.exec命令 ......................................................................................................................... 56 54.tr命令 .............................................................................................................................. 56 六.杂项 ........................................................................................................................................ 57

1.setenv PATH和set path = (....) ......................................................................................... 57 2.awk中输出单引号 ........................................................................................................... 57 3.awk或read找出文件行字符数大于80的行 ..................................................................... 57 4.shell脚本程序中的用户切换: ....................................................................................... 57 5.shell中删除文件且不显示输出信息和出错信息 ........................................................... 58 6.shell变量赋初值时存在特殊字符 ................................................................................... 58 7.sed的参数串中存在/特殊字符 ........................................................................................ 58

All rights reserved 版权所有,侵权必究

Page 6 , Total 83 第6页,共83页

19027008.doc Confidentiality level 密级

8.find在一个目录下找包含一个字符串的所有文件 ........................................................ 58 9.shell中确定一个文件的存在,文件ins_billdb ............................................................... 58 10.read的参数与实际域的个数不同 .................................................................................. 58 11.grep获取主机名和IP地址 .............................................................................................. 59 12.grep确定变量不是数字 ................................................................................................. 60 13.确定字符串是否是ip地址 ............................................................................................. 60 15.grep和awk列出某个目录下的一级子目录 ................................................................... 61 16.用printf将一个数打印成逗号分隔的形式 .................................................................... 61 17.iTELLIN示例一:在ksh中使用数组 ............................................................................ 62 18.iTELLIN示例二:从文件中读取参数: ..................................................................... 63 19.iTELLIN示例三:包含其它脚本文件 ....................................................................... 64 20.iTELLIN示例四:初始化一个临时文件供使用 ....................................................... 65 21.iTELLIN示例五:分解字符串 ................................................................................... 65 22.iTELLIN示例六:替换配置文件中的值 ................................................................... 66 24.iTELLIN示例八:用另外的文件作为函数库 ............................................................ 67 25.iTELLIN示例九:解压缩文件到一个目录 ............................................................... 68 26.iTELLIN示例十:判断操作是否成功 ....................................................................... 70 27.iTELLIN示例十一:封装创建一个组的函数 ........................................................... 71 28.iTELLIN示例十二:封装创建一个用户的函数 ....................................................... 72 29.iTELLIN示例十三:判断一个字符串是否是正整数 ............................................... 74 30.iTELLIN示例十四:判断当前用户是否有root权限.............................................. 75 31.iTELLIN示例十五:判断一个字符串是否是整数 ................................................... 75 32.iTELLIN示例十六:删除某个文件夹下若干天以来未改动的文件 ....................... 76 33.各种Unix环境对ksh的影响: .................................................................................... 76 34.set 使用注意点: ........................................................................................................ 77 35.判断对端节点的文件是否存在: ................................................................................. 77 36.awk的split函数的使用: .......................................................................................... 77 37.统计字符串在文件中出现的次数: ............................................................................. 77 38.如何进行精确匹配: ..................................................................................................... 81

All rights reserved 版权所有,侵权必究

Page 7 , Total 83 第7页,共83页

19027008.doc Confidentiality level 密级

Title 标 题:Unix 脚本编程总结与应用实例

Keywords 关键词:

unix,shell,正则表达式,匹配

Abstract 摘 要:

本文描述unix shell的各种应用实例。本文搜集整理常用的shell应用实例,以例子详述unix shell部分命令的使用,着重于正则表达式以及grep、sed、awk等命令,涵盖业务开发中需要使用到的unix shell编程命令,供查阅或者自测使用,面向对象为已经具备脚本编程基础的开发人员。 注:

文中大部分表达式在sco-unix unixware 7下使用sh测试通过,有些规则或表达式不能通过测试或结果不正确,在本文档中使用红色波浪下划线将其标出,使用时应注意验证其在不同shell下的表现。

本文不是命令手册,所以除部分命令如grep、sed、awk外,本文不详述讲述命令的各个参数,查看命令参数请使用man命令,本文着重于以实际例子讲述命令特征。

List of abbreviations 缩略语清单:

abbreviations缩略语 Description 描述 All rights reserved 版权所有,侵权必究

Page 8 , Total 83 第8页,共83页

19027008.doc Confidentiality level 密级

命令格式

一.shell与Unix平台

Unix平台 FreeBSD3.4 SGI IPIX6.5 HUPX-11 UnixWare 7 Solaris 8 (固有的) Solaris 8 (标准的) IBM AIX 4.3 IBM AIX 4.3 (可信的) Linux

二.shell基本知识

脚本参数:

shell脚本参数可以任意多,但只有前9各可以被访问,使用shift命令可以改变这个限制。参数从第一个开始,在第九个结束。

$0 程序名字

$n 第n个参数值,n=1..9 $* 所有命令行参数

$@ 所有命令行参数,如果它被包含在引号里,形如”$@”,则每个参数也各自被引号包括

$# 命令行参数个数 $$ 当前进程的进程ID(PID) $! 最近后台进程的进程ID $? 最近使用命令的退出状态

其他参数:

$CDPATH 包含一系列目录名,cd命令对他们诸葛进行搜索来查找作为参数传递给$EDITOR 程序(如e-mail程序)里使用的默认编辑器 $ENV

UNIX查找配置文件的路径

$HOME 用户初次登录时的起始目录名 $MAIL 用户的系统邮箱文件的名称

$MAILCHECK shell检查用户邮箱是否有新邮件并将结果通知用户的间隔时间(以秒为单位)

$PATH 包含用户的搜索路径的变量—shell用来搜索外部命令或程序的目录

$PPID 父进程的进程ID $PS1

系统第一个提示符,一般为$

Page 9 , Total 83 第9页,共83页

shell /bin/sh /sbin/sh usr/bin/sh $SHELL或/bin/sh /usr/bin/sh /usr/bin/ksh /usr/bin/sh /usr/bin/tsh /bin/sh 它的目录;如果该变量未设置,cd命令搜索当前目录

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

$PS2 系统第二个提示符,一般为> $PWD

当前工作目录的名称

所在的代码行,一般用来输出错误行号

将命令行参数往左移n位,但$0不变

$TERM 用户的控制终端的类型. $LINENO shift [n]

export 变量名表 将变量名表所列变量传递给子进程 read 变量名表 从标准输入读字符串,传给指定变量 echo set env

变量名表 将变量名表指定的变量显示到标准输出 显示设置变量 显示目前所有变量

set命令可以重新设定参数表.如set hello wold命令会设定$*为字符串hello world,$n和$#也同时受影响。

shift命令可以将所有参数左移一个单位,$*、$n、$#均受影响。

数组(在sh中不支持,可以在ksh中使用):

${#varlist[@]}

数组元素个数 数组元素

${datalist[index]}

执行命令:

1) command :直接执行命令command

2) sh command:启动一个shell process执行命令command 3) . command:在本process中执行命令command

4) exec command:本Script将会被所执行的命令所取代,当这个命令执行完毕之後,

本Script也会随之结束。

echo 命令使用的特殊字符

\\b \\c \\f \\n \\r \\t \\v \\\\ \\ON

退格

显示新行,但是不把光标移到下一行 换页

换行(光标移到下一行) 回车 水平制表符 垂直制表符 反斜杠

ASCII码为八进制数N的字符

${#datalist[index]} 数组元素长度

set命令:

把各位置参数的值依次设为‖argument-list‖里指定的参数,即重新设置$*,$@,$1-$9

如: set ―hello‖ ―world‖ 则 $*和$@都变成 hello world $1为hello

Page 10 , Total 83 第10页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

$2为world

三.grep 命令

搜索文本的匹配内容。

格式: grep [-option] pattern [filename] 选项:

-c 只输出匹配行的计数

-i 不区分大小写(只适用于单字符) -h 查询多文件时不显示文件名

-l 查询多文件时只输出包含匹配字符的文件名 -n 显示匹配行及行号

-s 不显示不存在或无匹配文本的错误信息 -v 显示不包括匹配文本的所有行

四.sed

查找和编辑文本。 格式:

(1) 直接键入命令

sed [-option] command_line filename (2) 将sed命令插入脚本文件,然后调用sed

sed [-option] -f program_file filename (3) 将sed命令插入脚本文件,并使脚本可执行

sed program_file [-option] filename 选项:

n 不打印;sed不把编辑行写到标准输出,默认为打印所有行(编辑的和未编辑的)。p命令可以用来打印编辑行。

c 下一个命令是编辑命令。在使用多项编辑时要加入该选项。

f 如果正在调用sed脚本,要使用此选项。此选项sed脚本支持所有的sed命令。

五.awk命令

awk 是一种程序语言,对于资料的处理具有很强的功能,对于文档里的资料做修改、比较、抽取等处理,awk 能够以很短的程序轻易地完成。如果使用C 语言写程序完成上述的操作不方便且很花费时间,所写的程序也会很大。

awk 能够依照用户定义的格式来分解输入的资料也可以依照用户定义的格式来打印资料。 awk 可用于在对象文件中逐行读取记录,按照命令中定义的匹配模式寻找相关记录,然后格式:

(1)直接键入命令:

awk [-Fchar] ?command_line‘ filename (2)将awk命令插入脚本文件,然后调用awk:

awk -f program_file filename

All rights reserved 版权所有,侵权必究

Page 11 , Total 83 第11页,共83页

对该记录进行操作动作。

19027008.doc Confidentiality level 密级

前一种形式的-Fchar确定间隔符,command_line为操作动作,filename为对象文后一种形式的program_file是指用户按一定格式编制好的对对象文件的匹配与操

件。 作。

六.find命令

通过文件名或其它特征查找文件。

格式: find [path-list] [predicate-list] 选项:

七.test命令

命令格式

test expression

expression中包含一个以上的判断准则以作为test评诂的标准。两准则间用\代 表逻辑AND 运算,\代表逻辑OR运算,而在准则前放置一\代表NOT 运算。如 果没有括号,则优先权则为\。和expr命令相同,相使用左右括 号时,必须在其前面加上\。以下是有关准则的叙述(符合叙述时传回真,否则传回伪): string string不为空白字串 -n string string的长度大於0 -z string string的长度等於0

string1=string2 string1等於string2 string1!=string2 string1不等於string2 int1 -gt int2 int1大於int2 int1 -ge int2 int1大於等於int2 int1 -eq int2 int1等於int2

All rights reserved 版权所有,侵权必究

Page 12 , Total 83 第12页,共83页

-type tp 文件类型为tp:

b 块特别文件 c 字符设备特别文件 d 目录文件 f 普通文件 p 管道文件(FIFO) s socket I 符号链接文件

-user uname 文件属于用户uname。 -group gname 文件属于组gname。

-size n 文件是n块大小(每块512字节),若n后跟一个c,单位为字节。 -atime n -mtime n -ctime n -print

在n天内已访问过此文件。 在n天内已修改过此文件

在n天内文件被修改、属性(拥有者、组、链接数等)被修改。 打印当前路径名 修改时间比file文件晚

-exec command {} \\; 执行命令 -newer file

19027008.doc Confidentiality level 密级

int1 -ne int2 int1不等於int2 int1 -le int2 int1小於等於int2 int1 -lt int2 int1小於int2 -r filename 档案可读取 -w filename 档案可写入 -x filename 档案可执行 -f filename 档案为一般档 -d filename 档案为目录

-s filename 档案为非空的一般档

test -r \

命令格式

expr expression

expression是由字串以及运算子所组成,每个字串或是运算子之间必须用空白隔开 。下表是运算子的种类及功能,而优先顺序则以先後次序排列,可以利用小括号来改变运算的优先次序。其运算结果则输出至标准输出上。

: 字串比较。比较的方式是以两字串的第一个字母开始,而以第二个字串的 字母结束。如果相同时,则输出第二个字串的字母个数,如果不同时则传 回0 。 \\| \\&

OR运算,如果它非null或者非0,返回第一个表达式,否则返回第二个表达式 AND运算,如果非null或非0,返回第一个表达式,否则返回0

整数算术运算符,其中%求余数。

八.expr命令

=、\\>、\\>=、\\<、\\<、!= 整数比较运算符 +、-、\\*、/、%

解释成其它意义。

expr 2 \\* \\( 3 + 4 \\) 其输出为14

1. if-then-elif-else-fi语句 if expression then

[elif expression then

then-command-list] . . . [else fi

else-command-list]

当expression中含有\\\等符号时,必须在其前面加上\,以免被 Shell

九.流程控制语法

All rights reserved 版权所有,侵权必究

Page 13 , Total 83 第13页,共83页

19027008.doc

All rights reserved Confidentiality level 密级

iffalseexpressiontruethen-commandsfi

if-then-fi语句的语义

iffalseexpressiontruethen-commandselse-commandsfi

if-then-else-fi语句的语义

版权所有,侵权必究 Page 14 , Total 83 第14页,共83页

19027008.doc Confidentiality level 密级

iffalseexpression1truethen-commandsexpression2trueelif-commands...else-commandsfalsefi

if-then-elif-else-fi语句的语义

4. for语句

for variable [in argument-list] do

command-list done

All rights reserved 版权所有,侵权必究

Page 15 , Total 83 第15页,共83页

19027008.doc Confidentiality level 密级

fordo将'argument-list'中的下一个词赋给'variable'执行'command-list'中的命令是'argument-list'中是否还有其它词?否done

for语句的语义

for var do

commands done

例如

for arg

do

echo $var done

调用 varlist.sh 111 222 3333 输出: 111 222 333

6. while语句

while expression do

command-list

Page 16 , Total 83 第16页,共83页

done

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

whiledo表达式的计算结果是否为真?否是执行'command-list'中的命令done

while语句的语义

7. until 语句

until expression do

command-list done

All rights reserved 版权所有,侵权必究

Page 17 , Total 83 第17页,共83页

19027008.doc Confidentiality level 密级

untildo表达式的计算结果是否为真?是否执行'command-list'中的命令done

until语句的语义

8. break及continue

这两者是用於for, while, until 等循环控制下。break 会跳至done后方执行 ,而continue会跳至done执行,继续执行循环。

9. case 语句

case test-string in

pat1)

command-list1 ;;

command-list2 ;;

pat2)

. . . patN) *)

;;

command-listN ;;

esac

All rights reserved 版权所有,侵权必究

Page 18 , Total 83 第18页,共83页

19027008.doc Confidentiality level 密级

case'test-string'是否等于pat1?否'test-string'是否等于pat2?...'test-string'是否等于patN?是执行'command-list1'中的命令执行'command-list2'中的命令执行'command-listN'中的命令done... case语句的语义

而pat 除了可以指定一些确定的字串,也可以指定字串的集合,如下 * 任意字串 ? 任意字元

[abc] a, b, 或c三字元其中之一 [a-n] 从a到n的任一字元 | 多重选择,如A|a

十.shell脚本调试

1.启动调试

启动调试Shell脚本的基本语法为:

$/bin/sh option script arg1 arg2 ... argN

这里显式声明了要执行脚本的Shell为/bin/sh,script是脚本的名字,arg1到argN是脚本的参数, option为调试选项,如下所示: -n -v

-x

读所有的命令,但不执行它们 在读时显示所有的行

在执行时显示所有命令和它们的参数。该选项常称为shell 跟踪选项或

改变脚本的第一行,象下面那样在该行声明一个调试选项: #!/bin/sh option

2.使用set命令

在每个调用激活调试模式中,调试模式的缺省行为对脚本中从第一行到最后一行都有效。有时我们只需要调试特定的函数或脚本的一部分,这时调试整个脚本就有些多余。通过使用set命令,我们可以在shell脚本的任何地方启动或取消调试,其基本语法为:

set [-|+] option

这里的option选项与上面的相同。

set –x 回显 set –v 详细

All rights reserved 版权所有,侵权必究

Page 19 , Total 83 第19页,共83页

19027008.doc Confidentiality level 密级

如#!/bin/ksh -xv

3.语法检查

在处理任何Shell脚本时,应在准备执行它之前检查脚本的语法,这使我们能改正许多问题。要启动语法检查可使用-n选项,如对于上面的buggy.sh脚本,象下面那样检查语法: $/bin/sh -n ./buggy.sh

All rights reserved 版权所有,侵权必究Page 20 , Total 83 第20页,共83页

19027008.doc Confidentiality level 密级

实例讲解

一.模式匹配

1.ls显示所有以hosts.开头的文件

ls –l hosts.*

2.ls显示包含x,y,z字符的所有文件 ls –d *[x-z]*

1.grep匹配/etc/services文件中以ftp字符串开头的哪些文本行

grep ?^ftp‘ /etc/services

9.grep匹配以ftp开头,后跟0个或多个-agent的文本行 grep ?^ftp(-agent)?‘ /etc/services

或 grep 注:

10.grep匹配以ftp开头,后跟1个或多个-agent的文本行 grep ?^ftp(-agent)+‘ /etc/services

Page 21 , Total 83 第21页,共83页

二.正则表达式

2.grep匹配以system文本结尾的行。 grep ?system$‘ file 3.grep匹配仅包含一个#字符的行。 grep ?^#$‘ file 4.grep匹配以或者[abc]开头的行 grep ?[[<]abc[]>]‘ file 5.grep匹配以Ftp或者ftp开头的行 grep ?^[Ff]tp‘ file 6.grep匹配F或者f以外的字符 grep ?[^Ff]‘ file 7.grep匹配除大写字符以外的字符 grep ?[^A-Z]‘ file 8.grep匹配以ftp或telnet开头的文本行 grep -E ?^ftp|^telnet‘ file

?^ftp(-agent)*‘ /etc/services

a)在sco unix下,上面的单括号前要加转义符\\ b)在sun os 5.8下,不论加不加单括号均不支持。

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

说明同上。

11.grep匹配带有数字6,后跟至少3个0的文本行(使用-E启用边界特性) grep -E ?60\\{3,\\}‘ /etc/services 12.grep匹配含有(abc)的文本 grep ?\\(abc\\)‘ file 13.常用正则表达式举例 正则表达式 ^[the] [Ss]igna[lL] 匹配功能 以the开头行 匹配单词signal,signaL,Signal,SignaL [Ss]igna[lL]\\. [mayMAY] ^USER$ [tty]$ \\. ^d..x..x..x ^[^l] [.*0] [000*] [iI] [iI][nN] [^$] [^.*$] ^……$ [a-zA-Z] [a-z][a-z]* [^0-9\\$] [^0-9A-Za-z] [123] [Dd]evice De..ce ^.$ ^\\.[0-9][0-9] ―‘Device‘‖ De[Vv]ice\\. [0-9]\\{2\\}-[0-9]\\{2\\}-[0-9]\\{4\\} 同上,但加一个句点 只包含USER的行 以tty结尾的行 带句点的行 对用户、用户组及其它用户组成员有可执行权限的目录 排除关联目录的目录列表 0之前或之后加任意字符 000或更多个 大写或小写I 大写或小写I或n 空行 匹配行中任意字符 包括6各字符的行 任意单字符 至少两个小写字母 非数字或美元表示 非数字或字母 1到3中的一个数字 单词Device或device 前两个字母为De,后跟两个任意字符,最后为ce 仅有一个字符的行 以一个句点和两个数字开始的行 单词Device 单词Device.或DeVice. 日期格式dd-mm-yyyy Page 22 , Total 83 第22页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

[1-9][0-9]\\{1,2\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\}\\.[0-9]\\{1,3\\} [^.*$]

16.特殊字符:$ . ? ― * [ ] ^ | \\ + ?

15.grep消除大小写:加入-i选项 grep -I ―sept‖ file

14.grep精确匹配:在抽取字符串后加\\>。 grep ―48\\>‖ file

IP地址格式nnn.nnn.nnn.nnn 匹配任意行 如果要查询这些字符,需要在前面加转义字符\\。

17.grep判断变量含有[HOST]字符串 if [ \

18.grep判断变量含有[xxx]字符串 if [ \

19.grep匹配后缀为c,h,j,s,cpp,hpp的文件

EXT_ALL='chjs'

EXT_PP='ch' EXT_NO_PP='js'

ls $1 | grep \

\

20.使用grep在文件中查找变量

grep `echo $user` /etc/passwd | cut –f5 –d?:‘

21.正则表达式语法

来自msdn,仅供参考。

Here are some examples of regular expressions:

/^\\s*$/ /\\d{2}-\\d{5}/ Expression Matches Match a blank line. Validate an ID number consisting of 2 digits, a hyphen, and an additional 5 digits. /<\\s*(\\S+)(\\s[^>]*)?>[\\s\\S]*<\\s*\\/\\1\\s*>/ Match an HTML tag. All rights reserved 版权所有,侵权必究

Page 23 , Total 83 第23页,共83页

19027008.doc Confidentiality level 密级

The following table contains the complete list of metacharacters and their behavior in the context of regular expressions: Character \\ Description Marks the next character as a special character, a literal, a backreference, or an octal escape. For example, 'n' matches the character \sequence '\\\\' matches \^ Matches the position at the beginning of the input string. If the RegExp object's Multiline property is set, ^ also matches the position following '\\n' or '\\r'. $ Matches the position at the end of the input string. If the RegExp object's Multiline property is set, $ also matches the position preceding '\\n' or '\\r'. * Matches the preceding character or subexpression zero or more times. For example, zo* matches \and \* is equivalent to {0,}. + Matches the preceding character or subexpression one or more times. For example, 'zo+' matches \and \but not \+ is equivalent to {1,}. ? Matches the preceding character or subexpression zero or one time. For example, \\{n} n is a nonnegative integer. Matches exactly n times. For example, 'o{2}' does not match the 'o' in \but matches the two o's in \{n,} n is a nonnegative integer. Matches at least n times. For example, 'o{2,}' does not match the \in \and matches all the o's in \'o{0,}' is equivalent to 'o*'. {n,m} M and n are nonnegative integers, where n <= m. Matches at least n and at most m times. For example, \the first three o's in \'o{0,1}' is equivalent to 'o?'. Note that you cannot put a space between the comma and the numbers. ? When this character immediately follows any of the other quantifiers (*, +, ?, {n}, {n,}, {n,m}), the matching pattern is non-greedy. A non-greedy pattern matches as little of the searched string as possible, whereas the default greedy pattern matches as much of the searched string as possible. For example, in the string \'o+?' matches a single \ All rights reserved 版权所有,侵权必究

Page 24 , Total 83 第24页,共83页

19027008.doc Confidentiality level 密级

while 'o+' matches all 'o's. . Matches any single character except \character including the '\\n', use a pattern such as '[\\s\\S]'. (pattern) A subexpression that matches pattern and captures the match. The captured match can be retrieved from the resulting Matches collection using the $0…$9 properties. To match parentheses characters ( ), use '\\(' or '\\)'. (?:pattern) A subexpression that matches pattern but does not capture the match, that is, it is a non-capturing match that is not stored for possible later use. This is useful for combining parts of a pattern with the \'industr(?:y|ies) is a more economical expression than 'industry|industries'. A subexpression that performs a positive lookahead search, (?=pattern) which matches the string at any point where a string matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?=95|98|NT|2000)' matches \2000\consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead. A subexpression that performs a negative lookahead search, (?!pattern) which matches the search string at any point where a string not matching pattern begins. This is a non-capturing match, that is, the match is not captured for possible later use. For example 'Windows (?!95|98|NT|2000)' matches \in \3.1\but does not match \in \2000\Lookaheads do not consume characters, that is, after a match occurs, the search for the next match begins immediately following the last match, not after the characters that comprised the lookahead. x|y [xyz] [^xyz] [a-z] Matches either x or y. For example, 'z|food' matches \\A character set. Matches any one of the enclosed characters. For example, '[abc]' matches the 'a' in \A negative character set. Matches any character not enclosed. For example, '[^abc]' matches the 'p' in \A range of characters. Matches any character in the specified range. For example, '[a-z]' matches any lowercase alphabetic character in the range 'a' through 'z'. All rights reserved 版权所有,侵权必究

Page 25 , Total 83 第25页,共83页

19027008.doc Confidentiality level 密级

[^a-z] A negative range characters. Matches any character not in the specified range. For example, '[^a-z]' matches any character not in the range 'a' through 'z'. \\b Matches a word boundary, that is, the position between a word and a space. For example, 'er\\b' matches the 'er' in \but not the 'er' in \\\B \\cx Matches a nonword boundary. 'er\\B' matches the 'er' in \but not the 'er' in \Matches the control character indicated by x. For example, \\cM matches a Control-M or carriage return character. The value of x must be in the range of A-Z or a-z. If not, c is assumed to be a literal 'c' character. \\d \\D \\f \\n \\r \\s \\S \\t \\v \\w \\W \\xn Matches a digit character. Equivalent to [0-9]. Matches a nondigit character. Equivalent to [^0-9]. Matches a form-feed character. Equivalent to \\x0c and \\cL. Matches a newline character. Equivalent to \\x0a and \\cJ. Matches a carriage return character. Equivalent to \\x0d and \\cM. Matches any white space character including space, tab, form-feed, and so on. Equivalent to [ \\f\\n\\r\\t\\v]. Matches any non-white space character. Equivalent to [^ \\f\\n\\r\\t\\v]. Matches a tab character. Equivalent to \\x09 and \\cI. Matches a vertical tab character. Equivalent to \\x0b and \\cK. Matches any word character including underscore. Equivalent to '[A-Za-z0-9_]'. Matches any nonword character. Equivalent to '[^A-Za-z0-9_]'. Matches n, where n is a hexadecimal escape value. Hexadecimal escape values must be exactly two digits long. For example, '\\x41' matches \Allows ASCII codes to be used in regular expressions. \\num Matches num, where num is a positive integer. A reference back to captured matches. For example, '(.)\\1' matches two consecutive identical characters. \\n Identifies either an octal escape value or a backreference. If \\n is preceded by at least n captured subexpressions, n is a backreference. Otherwise, n is an octal escape value if n is an octal digit (0-7). \\nm Identifies either an octal escape value or a backreference. If \\nm is preceded by at least nm captured subexpressions, Page 26 , Total 83 第26页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

nm is a backreference. If \\nm is preceded by at least n captures, n is a backreference followed by literal m. If neither of the preceding conditions exists, \\nm matches octal escape value nm when n and m are octal digits (0-7). \\nml \%un Matches octal escape value nml when n is an octal digit (0-3) and m and l are octal digits (0-7). Matches n, where n is a Unicode character expressed as four hexadecimal digits. For example, \? matches the copyright symbol (?). 三.sed命令

sed的正则表达式用//括住。 1.sed文本的定位方法: x x,y /pattern/ /pattern/,x x,/pattern/ x,y!

2.sed编辑命令 命令 p = a/ i/ d c/ s r w q l {} n g y

All rights reserved 版权所有,侵权必究

Page 27 , Total 83 第27页,共83页

x为一行号 表示行号范围从x到y 查询包含模式的行 在给定行号上查询包含模式的行 通过行号和模式查询匹配行 查询不包括指定行号x和y的行 /pattern/pattern/ 查询包含两种模式的行 意思 打印匹配行 显示文件行号 在定位行号后附加新文本信息 在定位行号后插入新文本信息 删除定位行 用新文本替换定位文本 使用替换模式替换相应模式 从一个文件中读文本 将文本写道一个文件 第一个模式匹配完成以后退出或立即退出 显示八进制ASCII代码等价的控制字符 在定位行执行的命令组 从另一个文件中读文本下一行,并附加到下一行 将模式2粘贴到/pattern n/ 传送字符 3.sed打印文件的第二行 sed -n ?2p‘ filename

19027008.doc Confidentiality level 密级

4.sed打印文件的第一到三行 sed -n ?1,2p‘ filename 5.sed打印匹配test的行 sed -n ?/test/p‘ filename 6.sed打印匹配$的行 sed -n ?/\\$/p‘ filename

7.sed打印最后一行:$是代表最后一行的特殊字符 sed -n ?$p‘ filename

8.sed脚本文件 #!/bin/sed –f ―/company/‖ a/ ―The suddenly it happen.‖ 将以上脚本保存为append.sed,使用chmod给予其可执行权限。使用append.sed

filename运行。脚本的执行将会在filename文件中查找company,在匹配行的后一行中附加新文本,输出到屏幕上(不改变原文件)。

10.sed上例中如果将a\\改为c\\:

则为替换,匹配行被替换为新文本。

16.sed从文件读取,r选项:

把文件内容附加到匹配行company.之后

All rights reserved 版权所有,侵权必究

Page 28 , Total 83 第28页,共83页

9.sed上例中如果将a\\改为i\\:

则为插入,在匹配行的前一行中附加新文本,输出到屏幕(不改变原文件)。

11.sed删除第一行 sed ?1d‘ filename 12.sed删除第一到第三行 sed ?1,3d‘ filename 13.sed删除最后一行 sed ?$d‘ filename 14.sed替换文本

sed ?s/night/NIGHT/‘ filename #将所有night替换为NIGHT sed ?s/night//‘ filename

#将night删除

15.sed输出到文件,w选项:

把第1到2行的内容输出到文件field中,不存在则创建。

sed ?1,2w field‘ filename

19027008.doc Confidentiality level 密级

sed ?/company./r sedex.txt‘ filename

17.sed优势:

用户在获得不同格式的、带有各种奇形怪状格式控制符的文本,需要将它编成易读的文本时,就可以使用sed流编辑程序。另外,在重新处理具有比较固定格式的文本以生成新格式的文本时,也可以使用sed流编辑程序。

18.sed常见的一行命令集 命令 ?s/\\.$//g‘ ?-e/abcd/d‘ ?s/[ ][ ]*/[ ]/g‘ ?s/^[ ][ ]*//g‘ ?s/\\.[ ][ ]*/[]/g‘ ?s/^$/d‘ ?s/^.//g‘ ?s/COL\\(…\\)//g‘ ?s/^\\///g‘ ?s/[ ]*/[ ]/g‘ ?s/^[ ]//g‘ ?s/^[ ]*//g‘ ?s/[ ]*//g‘ ?s/[ ]*/[ ]/g‘ ?s/[ ][ ][ ][ ]*/[ ]/g‘

19.sed去掉字串变量前后的空格 str1=‖ 1234 ―

str2=` echo ${str1} ` 此时str2不含有前后的空格。

如果使用sed如下:

str2=‖` echo ${str1} | sed ?s/^[ ]*//g‘ | sed ?s/[ ]*$//g‘ `‖ 如果使用awk如下:

str2=‖` echo $(str1) | awk ?{print $1}‘`‖

或:

str2=‖` echo ${str1} | sed ?s/(^\\s*) | (\\s*$)//g‘ `‖

注:使用awk和sed的缘故是可以和前一次的操作一次性完成,而不必单独使用一条语句去除空格。例如下面第二个awk的作用就是去除空格:

TmpInf1=\

20.sed去除文件count中的前后的空格

Page 29 , Total 83 第29页,共83页

意思 删除以句点为结尾行 删除包含abcd的行(疑为‘/abcd/d‘) 删除一个以上空格,用一个空格代替 删除行首空格 删除句点后跟两个或多个空格,用一个空格代替 删除空行(sh不支持d,但在ksh下支持) 删除第一个字符 删除COL以及其后的三个字母 删除开头的/ 删除所有空格并用tab代替 删除行首的一个tab 删除行首的所有tab 删除所有tab 删除所有tab并用一个空格代替 每四个空格删除并使用一个tab代替 All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

tmp=`sed 's/^ *//g' count | sed 's/ *$//g' ` 则tmp为文件内容,不含有前后的空格。

21.sed提取最后一个目录名和程序名

例如从../../etc/passwd或者/etc/passwd得到passwd 方法一:使用临时文件

#得到当前路径,输出到a文件 pwd >a

#读取a文件,过滤首字母/和尾字母/,将结果输出到b文件 sed 's/^\\///g' a | sed ?s/\\/$//g‘ >b do

#读取b文件,过滤首字符串xxxx/,将结果输出到a文件 sed 's/^[a-zA-Z0-9]*\\///g' b >a #将a文件拷贝到b文件 cp -f a b done rm –f a rm –f b

方法二:使用变量(优于文件形式) c_path=`pwd`

#过滤首字母/和尾字母/

c_path=`echo $c_path | sed 's/^\\///g' | sed ?s/\\/$//g‘ ` while [ `echo $c_path | grep -c '\\/'` -gt 0 ] do

c_path=`echo $c_path | sed 's/^[a-zA-Z0-9_.]*\\///g'` done

echo $cur_path 方法三:使用basename命令 c_path=`pwd`

c_path=`basename $c_path` 注:参数扩展见五.5

while fgrep \\/ b

22.dirname或参数扩展提取目录名

例如从$0参数中提取运行的路径:从../../etc/passwd/得到../../etc,从方法一:dirname c_path=$0

c_path=`dirname $c_path`

注:如果没有路径,则c_path得到为单字符‖.‖。所以,判断是否在当前路径执

行可以使用条件 ―-$c_path‖ = ―-.‖

/etc/passwd得到/etc

方法二(参数扩展在基本sh下不支持):

Page 30 , Total 83 第30页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

c_path=$0

c_path=‘${0%/*}‘

注:如果没有路径,则c_path得到为文件名,即$0。所以,判断是否在当前路

径执行可以使用条件 ―-$c_path‖ = ―-$0‖

23.grep,sed获取文件的扩展名

例如从../../home/file.c得到c

方法一: file=$1

#得到最后一级文件名 ,如file.c

file=`basename $file`

#如果文件名中不含有.,则表示没有后缀

if [ 1 -gt `echo $file | grep -c '\\.'` ]; then echo \else

#过滤掉最后一个.以及之前的所有字符,得到扩展名 echo `echo $file | sed \fi

方法二:(参数扩展在基本sh下不支持) file=$1

#得到最后一级文件名 ,如file.c

file=`basename $file`

#从file的尾部开始删除匹配.*(一个.后跟若干字符)的最小部分并返回剩余部

分 echo \

24.sed获取第n个匹配的行的行号

get_match_line_no()

{

n=$1 #第n个匹配的行 file=$2 #要搜索的文件

str=$3 #要匹配的字符串

sed -n \} 注:

若仅仅想匹配第一个,可以用一个sed完成 sed -n '/include/ { = q

}' print.cpp

其中: =表示打印行号, q标识匹配第一个就退出。

四.awk命令

All rights reserved 版权所有,侵权必究

Page 31 , Total 83 第31页,共83页

19027008.doc Confidentiality level 密级

1.awk字段分隔符:

2.awk匹配模式

分为三类:

a) awk的关系表达式:

用来说明字段是否与要求符合。例如:$1==‖char‖ 、$2>20等等。 b) awk的正则表达式:

用//括住。规则与sed相同。 例如:

/^.$/ 匹配只有一个字符的行。

BEGIN模式意味着在读取第1行之前的匹配模式。它常用于初始化,例如设置分隔符、打印标题以及变量赋初值等。END模式是在处理完所有记录行以后的匹配模式。它常常用于输出结果。

3.awk“模式匹配-动作”

a)在每一行中匹配‘foo‘,若匹配则打印该行

awk ?/foo/ {print $0}‘ filename

b)在每一行中匹配第一个字段是否为‘foo‘, 若匹配则打印该行 awk ?$1~/foo/ {print $0}‘ filename c) awk的BEGIN和END模式:

-F选项指定了字段分隔符为冒号

awk -F: ?{print $1,$3}‘ file

4.awk内部变量 (部分变量需要验证) 变量 ARGC ARGV FILENAME FNR FS NF NR OFMT OFS ORS RS RSTART RLENGTH SUBSEP CONVFMT 含义 命令行实参个数 命令行实参数组 当前输入文件名 当前文件中的记录数 输入字段分隔符 当前记录中的字段数 至今读取的记录数 数的输出格式 输出字段分隔符 输出记录分隔符 输入记录分隔符 由match()匹配的第一个字符索引 由match()匹配的串的长度 下标分隔符 数值的内部转换格式 - ―\\34‖ %.6g 只读 只读 可读可写 默认值 - - - - 空白及制表符 - - %.6g 空白 换行符 换行符 - 属性 只读 可读可写 只读 只读 可读可写 只读 只读 可读可写 可读可写 可读可写 可读可写 只读 All rights reserved 版权所有,侵权必究

Page 32 , Total 83 第32页,共83页

19027008.doc Confidentiality level 密级

5.awk用户定义变量

用户自定义变量用以存放数据以及进行运算。

6.awk算术运算

算术运算在内部以浮点形式完成,也包含一般的加、减、乘、除、余和乘幂,运算符分别为‖+‖、‖-―、‖*‖、‖/‖、‖%‖和‖^‖。

a) awk ?$1==‖Feb‖ {sum=$2+$3} END{print sum}‘ filename

b) awk ?$1==‖ATOM‖ {a=a+$2;i=i+1}‘ filename c) 7.awk高级算符

8.awk内部算术函数 函数名 cos(x) exp(x) int(x) log() rand() 返回值 x的余弦值,x是弧度 x的幂函数 x的整数部分 x的自然对数 得出一个随机数,此随机数平均分布在0 和1 之间。这个值不会是0,也不会是1。 每次执行awk, rand 产生相同的随机数序列。 sin(x) sqrt(x) srand(x) x的正弦值,x是弧度 x的平方根 x是针对rand()的新的种子。设定产生随机数的开始点或seed 随机数种子为x。如果在第二次你设定相同的seed 值,你将再度得到相同序列的随机数如果省略参数x,则现在的日期时间会被当成seed。这个方法可使得随机数是真正不可预测的srand 的。 返回值(return value)是前次所设定的seed 值

9.awk内置函数

awk的字符串使用引号括起。通过连接常量、变量、数组元素、函数和其它表达式可以创建串表达式。

例如:打印第几号记录和一个冒号,然后打印文本行。

{print NR‖:‖$0} 函数名 gsub(r,x) gsub(r,s,t) index(s,t) length(s) 返回值 在当前记录中,用s替换r,返回替换数 在串t中,用s替换r,返回替换数 返回s串中t的位置,不出现时为0 返回s的长度 Page 33 , Total 83 第33页,共83页

++或者+=等等。

awk ?$1==‖ATOM‖ {a+=$2;i++}‘ filename

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

match(s,r) split(s,a) split(s,a,r) sub(r,s) sub(r,s,t) substr(s,p) substr(s,p,n) 返回r在s中出现的位置,不出现时为0 针对FS把s分成数组a,返回字段数 针对r把s分成数组a,返回字段数 在当前记录中把第一个r替换成s,返回替换数 在t中把第一个r替换成s,返回替换数 返回从位置p开始的s的后缀 返回从位置p开始长度为n的s子串 注: p最小为1,当p为0时,p被置为1; n个字符包括p所在字符。 sprintf(fmt,expr_list) 根据格式串fmt返回经过格式编排的expr_list system(cmd) toupper(s) tolower(s) close( expr ) 执行命令并返回出口状态 将输入参数s中的字符全部转换为大写字符并返回转换后的字符串 将输入参数s中的字符全部转换为小写字符并返回转换后的字符串 关闭由expr表示的文件或管道,文件或管道可能被print、printf语句或调用内建函数getline打开。如果成功,函数返回0,否则返回非0值 getline 这个内建函数将$0设置为当前输入文件的下一个输入记录,getline < file将用从file中获得下一条记录修改$0的值,getline x用下一行的内容替换变量x,而$0仍然是当前行的内容。但下一次返回的将是下下一行的内容。cmd | getline将从管道中获得cmd命令的输出。如果成功,getline返回1,遇到文件结尾,getline返回0,出错返回-1。

10.awk的自定义函数

格式:

function func_name(arg_list) { } 例如:

将下列代码保存在awk_pro文件中,调用echo 5 | awk –f awk_pro,将得到输

出:5!is120。

function fact(n)

{

if(n<=1)

return 1

Page 34 , Total 83 第34页,共83页

else

return n*fact(n-1)

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

}

{print $1‖!is‖ fact($1)}

数组实参可以通过应用传递,所以针对该函数有可能改变数组元素或创建一个新元素。标量实参将用值传递,形式参数是局部变量,但其它变量都是全局量。 11.awk的“下一”语句:

next 语句 、next file 语句 、 exit 语句

next语句强迫awk立刻停止处理目前的记录而继而处理下一个记录。

next file类似next,它强迫awk立刻停止处理目前的数据文件而继而处理下一个文件。

exit语句会使得awk程序停止执行而跳出。如果END出现,它会去执行END的动作。

12.awk中的字符串相加:

str3为str + str2 + str str=\ str2=\ str3=str str2 str

13.awk的逻辑运算符 表达式 含义 x等于y时为真 x大于y时为真 x大于或等于y时为真 x小于y时为真 x小于或等于y时为真 x不等于y时为真 x包含y时为真 x不包含y时为真 x==y x>y x>=y x

14.awk的逻辑与||、逻辑或&& awk '$2==\

awk '/2400/ && /foo/' BBS-list awk '/2400/ || /foo/' BBS-list awk '!/foo/' BBS-list

15.awk的FS、OFS和ORS使用:

以‘|‘为分隔符输出各个域

awk ?BEGIN{OFS=‖|‖}{print $1,$2,$3,$4}‘ filename

awk 'BEGIN {OFS=\awk 'BEGIN {FS=\

Page 35 , Total 83 第35页,共83页

例如: awk '$2~\

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

16.awk的sprintf函数的使用

17.awk的重定向,输出到文件:

19.awk删除输入行中特定行的换行字符

例如:删除奇数行的换行字符 awk ' {

if (NR % 2 == 1)

printf \else

print $0

}'

18.awk删除文件的第一行 awk ?{ if (NR % 2 == 1) printf ―%s‖, $0 ‘

可以使用>或者>>

print \

sprintf格式化字符串

print sprintf(\

20.awk获取输入行中,域的最大个数

awk '{if (NF > max) max = NF} END {print max}'

21.awk输出一行超过80 个字符的每一行

awk 'length($0) > 80'

22.awk输出至少一个域的所有行。可用来将一个文档里的所有空白行删除

awk '{if (NF > 0) print}'

23.awk输出范围在0 到100 之间的7 个随机数

awk 'BEGIN {for (i = 1; i <= 7; i++)

print int(101 * rand())}'

24.awk将所有用户的login名称依照字母的顺序输出

awk 'BEGIN {FS = \

25.awk将一个文档的总行数输出

awk '{nlines++} END {print nlines}'

或awk 'END {print NR}'

26.awk输出文档的内容时会在每行的最前面输出行号它的功能与'cat -n' 类似

All rights reserved 版权所有,侵权必究

Page 36 , Total 83 第36页,共83页

19027008.doc Confidentiality level 密级

awk '{print NR,$0}'

27.awk自定义函数的例子一: 第一个域与第二个域的平方和

awk ?{print \

function SquareSum(x,y) { sum=x*x+y*y return sum }‘

28.awk的split、数组、注释

test.awk 文件:

#!/bin/awk -f BEGIN {

record=\

num=split(record,myarray,\} END{

for(i=1;i<=num;i++) {

print myarray[i] # print the element of array }

}

调用:

./test.awk /dev/null 输出: 123 456 789

str是字符串,num定义了要打印的域的序号。 str=‖abc bcd cde efg‖ num=2

29.awk打印传入字符串的第n个分隔域。

echo \打印出: bcd

注:k的值是$1+1而不是$1,因为$num也要算awk的传入参数。

30.在awk中使用shell中的变量

str1=\str2=\

echo \if(\\$2==\\\

print(\\\

All rights reserved 版权所有,侵权必究

Page 37 , Total 83 第37页,共83页

19027008.doc Confidentiality level 密级

}'\

打印

hello world

另一种方法就是把shell中的变量当参数通过管道传入到awk中。

需求:

已知变量 usr的值为 sms, 要求使用 awk 在 /etc/passwd文件中查找(以:为分隔符号), 当匹配到第一个域(name)时,打印第6个域(home).

所需表达式:

awk –F: ?{ if($1==‖sms‖) print $6 }‘ /etc/passwd

#!/bin/ksh #set -x usr=\

# 方法一,使用临时文件 tmp.txt

eval \/etc/passwd >tmp.txt\cat tmp.txt

# 方法二,完全使用eval合成 par1='\\$1' par6='\\$6' equal='\\\eval \awk -F: '{ if ( $par1==$equal$usr$equal ) print $par6 }' /etc/passwd \\\#echo \home=`eval \echo $home

注:

(1) eval 按照双引号进行展开, 每一对双引号展开一次, 我们例子中的句子: eval \awk -F: '{ if ( $par1==$equal$usr$equal ) print $par6 }' /etc/passwd \\\

awk中引用的变量被两对双引号包括,所以要构造出所需表达式,需要保证$1和‖能将禁得起两次展开:

二次展开定义式:

par1=‘\\$1‘ # 单引号 在两次展开以后就变成了$1 二次展开定义式:

equal=‘\\‖‘ # 单引号

All rights reserved 版权所有,侵权必究

Page 38 , Total 83 第38页,共83页

19027008.doc Confidentiality level 密级

在两次展开以后就变成了‖

由于希望$usr在两次展开之后变成 sms, 所以不需要二次展开定义式,如下定义式:

usr=\

在两次展开以后就变成了sms

(2) 当合成cmd以后, 会发现cmd已经合成为:

cmd: awk -F: '{ if ( $1==\但是不能调用 home=`$cmd`

来获取其输出值 ,而只能使用 home=`eval \

方法三(推荐用法): 使用 awk –v参数. awk –F: -v usr=\?{ if ($1==usr) rint $6 }‘ /etc/passwd 注:如果有多个参数需要共享,可以使用多个-v参数传入.

其它实现的方法:

# 方法四: 查找以 $usr: 开头的行,打印第6个元素

home=`cat /etc/passwd | grep \$6 }'`

echo $home

# 方法五: 重新组织行,将要查找的字符串放到首位,各个字符串以空格分隔, 然后查找以 $usr 开头的行,打印相应元素.

# 此方法适用于不以要查找的字符串为开头的行, 重新组织以后,就可以使用方法四.

home=`cat /etc/passwd | awk -F: '{ printf(\%s\\n\}' | grep \| awk '{print $2 }' ` echo $home

31.在某个目录下查找包含特定字符串的文件。返回文件名称

dir=\find_str=\

grep -c \'BEGIN{FS=\

返回找到文件的列表,每行一个文件。

五.其它命令

1.eval命令:可用于动态生成和执行代码

Page 39 , Total 83 第39页,共83页

All rights reserved 版权所有,侵权必究

19027008.doc Confidentiality level 密级

foo=10 x=foo eval

y=‘$‘$x

echo $y

输入10,即eval y=‘$‘$x被解释为y=$foo,即y=10。 nDay1=\nDay2=\nDay3=\

# 遍历变量nDay1 ...nDay3,打印其值 for i in 1 2 3 do n=$i

eval nVar='$nDay'$i echo $nVar done

应该依次输出 $nDay1 , $nDay2, $nDay3 ,即: 111 222 333

另一个用于数组的例子, #!/bin/ksh

nDay_1[0]=\nDay_2[0]=\nDay_3[0]=\ k=2

for i in 1 2 3 do

eval \ echo ${nVar} done

# 打印

# 赋值, 型如:nDay_x[n]=$i

eval \# 访问, 型如:nVar=${nDay_x[n]}

应该依次输出 ${nDay_1[2]}, ${nDay_2[2]}, ${nDay_3[2]}, 即: 1 2 3

2.exit n:退出

0代表成功,1-125代表出错代码,128以上引发一个信号。

我们脚本或许会和别的脚本交互,这个时候需要相互传递信息,exit是被调用进程的

Page 40 , Total 83 第40页,共83页

返回值,调用进程使用$?获得返回值。

All rights reserved 版权所有,侵权必究

本文来源:https://www.bwwdw.com/article/zx53.html

Top