860 likes | 1.01k Views
操作系统. 第十一章 UNIX 实用程序. 陆松年 snlu@sjtu.edu.cn. 11.1 目录操作. 显示用户当前所处的工作目录. 11.1.2 改变工作目录 cd. 11.1.1 显示工作目录 pwd. cd [ 目录名 ] “ 目录名” 缺省, cd 命令就使工作目录移到了 HOME 目录。. 11.1.3 列目录内容 ls. ls [ - 选项 ] [ 文件名表 ] 按字符顺序显示一个目录内的所有文件名。
E N D
操作系统 第十一章 UNIX实用程序 陆松年 snlu@sjtu.edu.cn
11.1 目录操作 显示用户当前所处的工作目录 11.1.2 改变工作目录cd 11.1.1 显示工作目录pwd cd [目录名] “目录名” 缺省,cd命令就使工作目录移到了HOME目录。
11.1.3 列目录内容ls ls [ -选项] [文件名表] • 按字符顺序显示一个目录内的所有文件名。 (1)‘l’长列表,除了文件名外,还列出每个文件的文件类型、文件权限、链接数、文件所有者、组名、文件大小、修改日期等信息,其输出形式为: -rwxrwxrwx 1 zhang zgroup 10478 May 15 8:18 filename (2)‘t’按文件的修改时间顺序列出所有的文件。 (4)‘a’将以‘.’开始的隐显文件名也显示出来。
11.1.4 创建新目录mkdir mkdir [-m 权限模式] 目录名 • 模式选项缺省时,mkdir以777的方式建立指定的目录项。 11.1.5 删除目录项rmdir rmdir [-p] 目录名 只有当一个目录是空的时候,才能删除它 。
11.2 文件操作 • 11.2.1 复制文件cp cp命令有三种格式 : cp 文件名1 文件名2 cp 文件…目录 cp -r 目录1 目录2 替代一个已存在的文件时要事先获得自己的确认,则可以使用 -i(对话)选项,只有用户键入Y或y(yes)时,该命令才替代原文件。
11.2.2 移动或重新命名文件mv mv 文件名1 文件名2 mv 文件…目录 mv 目录名1 目录名2 11.2.3 删除文件rm rm [-fi] 文件… -f(force)表示强制 -i表示对话方式 rm -r [-fi] 目录
11.2.4 文件的链接ln • 允许多个文件名与一个文件实体建立链接(硬链接),一个文件可以取多个名。 ln 文件名 新文件名 • 在另一个目录中为一个或多个文件建立同名链接: ln 文件…目录
11.2.5 符号链接ln -s • ln –s 命令建立的新的文件或目录与原来文件或目录的路径名映照。当你访问一个符号链接时,UNIX靠这个映照找到原文件的路径,并对其进行访问。这种链接方法又称为软链接。通过软链接访问文件的速度比硬链接稍慢一些。 • ls -l /bin/sh lrwxr-xr-x 1 root 14 Sep 25 14:17 /bin/sh -> ../usr/bin/sh
11.2.6 报告两个文件的差别 • diff [-bi] 文件1 文件2 以编辑指令的形式逐行显示两个文件的差异。 -b忽略由于空格及制表符而引起的差异。 -i忽略字母的大小写差异。 • diff命令也能用于比较二进制文件,例如比较长度相同的不同版本的可执行代码。由于二进制文件没有行结构,diff程序将不显示所有的编辑行信息。
11.2.7 推测文件的类型file • file 文件… 给出文件的类型。 • 对于正文文件,file程序检查它的前512字节内容,试图猜测所用的语言是C语言、FORTRAN、Shell等程序设计语言,还是英文、法文、西班牙文等文字。因为是猜测,类型确定并非绝对可靠。 • 对于二进制文件,file试图确定文件是否是可执行的目标文件、库文件和cpio等映象文件。 • 凡是file不能识别的二进制文件就归为“数据”一类。
11.2.8 查找文件find • find 目录 [条件] [操作] -mtime [+|-]n指定文件的修改时间。 -name 文件名 是find最重要的条件。 • 文件名中可包含Shell 的元字符,由于元字符是由find解释和扩展的,故必须予以转义。 -print印出找到文件的带有路径的文件名,是最常用的操作。 -exec 对找到文件要执行的Shell命令。命令的参数为“{ }”,它将由find 命令找到的文件名替换,命令的末尾为转义的分号。 -ok 类似 -exec,但在执行命令前,并等待用户确认,用户键入y(yes)后才执行。
find 举例 find . -name *.c.old -print或 find . -name \*.c.old -print find . -name \*.c -mtime +7 -print 印出当前目录子树中7天以前修改过的文件 find /usr \(-name \*.c -o -name core\) -print 条件中的一对转义的园括号不能省,否则由于 -o的优先级低,仅仅印出core文件。
find . -print 印出当前目录子树下的全部文件: 选项-print的作用可以通过执行echo命令来实现: find . -exec echo {} \; 删除一星期以前的新闻项: find /usr/news -mtime +7 -exec rm {} \; 或更安全地,在删除前征求用户意见: find /usr/news -mtime +7 -ok rm {} \;
11.2.9 改变文件的属主chown chown 新属主 文件…或 chown -r 新属主 目录 第二种格式用于(递归地)改变目录以及该目录下的所有文件和子目录的属主。 chown user *.doc 将当前目录下以 .doc为后缀的所有文件的属主改变为user。当一个用户将文件的所有权转交给其他的用户后,立即失去了对该文件的控制权。
11.2.10 改变文件的存取方式chmod • 本命令用于改变文件主、组用户和其他用户对文件或目录的存取许可权,只有文件主或超级用户有权改变文件存取权。 chmod 模式 文件…|目录… chmod 777 file 将文件file的权限置为所有的用户都可读可写可执行。 chmod 644 file 将文件file的权限置为文件主可读可写,组用户和其他用户只有读许可。
可用符号表示文件的存取模式 u (user)文件主 g (group)同组用户 o (other)其他用户 a (all)所有用户 + 添加存取许可 - 取消存取许可 r (read)读许可 w (write)写许可 x (excute)执行许可 s 执行时置进程的有效用户标识数为文件主的标识数。 chmod ug+w file 给文件的文件主和组用户添加写许可。
chmod a+rx file 给所有的用户增加读和执行文件的许可。 chmod go+s file 组用户和其他用户执行文件时的有效进程标识数置文件主标识数。/etc/passwd文件普通用户是不能修改的,但用户能用passwd命令改变自己的口令,从而修改了passwd文件,这是由于可执行代码文件/bin/passwd的文件主是root,且该文件的s位置位。
11.2.11 设置屏蔽码umask umask [三位八进制数] • 三位八进制数分别表示文件主,同组用户和其他用户的读/写/执行权限。 • 执行了umask命令后,新建文件的实际权限为创建时的权限值减去umask命令指定的八进制数值。 • umask 022 命令去掉创建文件时同组用户和其他用户的写权限,用方式777创建的文件变成方式755。
11.2.12 存取DOS文件 一些微机上的UNIX系统,如XENIX,系统V和SCO UNIX等,为了方便用户存取DOS格式的文件,提供了若干存取DOS软盘文件的系列命令,以便于用户在DOS系统和UNIX系统之间传递文件。主要的命令有: doscatdosfile doscpdosfileunixfile或 doscpunixfiledosfile dosdirdosdirectory dosrmdosfile dosfile格式为 驱动器 :文件名。 unixfile格式为 带路径的UNIX文件名。例 doscp a:file ./file 将软驱A盘中的文件file拷贝至UNIX中。
11.3 显示和打印 11.3.1 回应命令行上的参数echo echo [-n] 参数表 • echo命令看似平淡无奇,其实它是最常用的命令之一,特别是在Shell程序设计中。echo命令可用于显示命令行中的字符串常数,Shell变量值,产生诊断信息,向管道发送数据等。如 echo the home directory : $HOME • echo命令要显示的内容中如含有* 等元字符,那它将被扩展成当前目录下的一组文件名,因此必须使用转义符‘\’或单引号将它们括起来。 • 如果使用双引号,那么双引号中的$ 、\ 、单引号和元字符的特殊含义都不受影响。 • 选项 -n使得echo命令在输出一行后不换行。
11.3.2 连接并显示文件cat cat(catenate连接)的功能是按顺序读入参数部分的所有文件,并将其写至标准输出。 cat preface chapter* > book • 如cat的参数部分只有一个文件,则简单地显示单个文件内容;如cat的参数部分无文件,cat将从标准输入中读入内容,并将其写至标准输出。 • 在cat命令中可带若干个选项,其中较有用的是 -v选项,该选项使控制字符也显示出来。
11.3.3 分页显示程序more • 如用cat显示一个不太短的文件,大部分数据在人眼抓住它之前就在屏幕上滚过去了。使用more命令,可以一次一屏地显示文件。 more [+起始行号] | [+/初始查找模式] [文件] • 其中[+ 起始行号]和[+ /初始查找模式]这两个选项不能同时使用。如没有这两个选项,more从文件头开始显示。文件参数缺省,more从标准输入读。 • more程序每输出一屏后,在屏幕下方给出类似这样的提示信息: - More - - ( 20% ) • (从中可知程序名more的来历。)提示还有数据没有显示完,已显示了全文件的20%。
more内部命令: 用户可以输入以下的more内部命令: 空格键 显示下一屏。 RETURN键 显示下一行。 nf向下移动n屏,其中n是数字。 nb向上移动n屏,其中n是数字。 /模式 向下查找指定的字符串模式。 n重复前面查找命令。 =显示当前的行号。 h显示more所有命令的帮助信息。 q退出more。
11.3.4 显示文件的头部head和尾部tail • head命令用于显示文件的开始部分,其格式为: head [-显示行数] 文件 • 选项缺省时head显示文件的头十行。如不指明文件,head就从标准输入中读。 • tail命令用于显示文件的结尾部分,其格式为: tail [+起始行] 文件 tail [-起始行] 文件 [+起始行]指示tail程序从文件头数起的起始行开始显示至文件尾(tail是UNIX可不以‘-’字符引出选项的少数命令之一)。 [-起始行]指示tail程序从文件尾数起的起始行开始显示至文件尾。
Head和tail的例子 tail -20 file • 显示file的最后20行。选项缺省,显示最后十行。文件名缺省,tail从标准输入中读。 • 如从文件的第51行起显示到第70行可用命令: head -70 file | tail -20
11.3.9 卸出文件od • 一般的显示或编辑程序不能处理二进制文件,但有时用户又要观察这类文件的内容,那么od(octal dump)可以各种格式显示二进制文件的内容。od命令的格式为: od [格式] [文件] [位移量] • od可按以下格式显示 -b按二进制显示。 -o按八进制显示,这是默认值。 -d按十进制显示。 -x按十六进制显示。 -c按ASCII码显示。
按ASCII码显示 • 当时,除了下列的转义代表不可印刷的字符外,其它不可印刷的字符用三位八进制数表示。 \o NULL \b退格 \f换页 \n换行 \r回车 \t制表符 • 位移量用于控制从文件中的哪一个位置开始显示,并以八进制表示。如果有一个句点加在位移量后,就解释为十进制数,如“11.”解释为十进制10。如果字符‘b’加在位移量后,该位移量就表示为块数。例 按八进制格式显示文件: od a.out 或 od -o a.out • 如果数据不是从文件中而是从标准输入中读取,在偏移量前就要加‘+’号。
11.4 过滤器 • 一个能从标准输入读取数据,经过选择和处理后将结果写向标准输出的程序,统称为“过滤器”。这类程序的作用很象物理实验室或工业生产中所用的过滤器,因此而得名。 • 从广义讲,象cat,head和tail和等程序都是过滤器,但在本节中我们仅涉及能对输入做一定变换和加工处理的过滤器。 • 有些过滤器的功能很强,要全部掌握很困难,这儿只介绍重要的过滤器中最常用的功能。
11.4.1 正则表达式 • 正则表达式(Regular Expression)是用于确定字符串模式的一个规则集。很多UNIX的过滤器和一些工具软件能使用通用而简洁的正则表达式自动、高效地搜索和处理字符串模式。UNIX的文件名匹配式有点类似于正则表达式,但其规则简单得多。 • 正则表达式中能使用很多的特殊符号,还有一些与字符串匹配时有关的规则,不幸的是这些符号和规则因不同的程序而稍有变化,因此在初学时还要查看与具体程序有关的手册。
1.正则表达式中的特殊符号 在正则表达式内某些符号是特殊符号,这些符号及意义列举如下: ·能与除换行符之外的行内任何字符相匹配。 * 匹配前一字符的零次或多次出现。*如紧跟在字符类后,则和该字符类中任何字符组成的串相匹配。 \用于改变特殊符号的含义,也可后跟一字符的八进制表示。 [ ]定义字符类,匹配方括号内的任何一个字符。在方括号内还有三个字符有 特殊含义: ‘-’指示字符的范围, ‘\’是转义符,紧跟在左方括号后的‘^’是脱字符,匹配所有不出现在方括号内的字符。
^ 如出现在正则表达式首,则表示行首,^ 的下一个字符串应当是行首的头一个字符串。如 ^begin, begin仅出现在行首才匹配。 $如出现在正则表达式末尾,则表示行尾,$前面的正则表达式所匹配的字符串仅出现在行尾才匹配。 双引号内的字符在匹配时忽视其特殊含义。 \<字首匹配。 \>字尾匹配。
正则表达式例 ab*c与a后面跟零个和多个b再紧跟c的字符串匹配。 ·*与包含空串在内的任何字符串相匹配。 [a-zA-Z]*只与字母组成的字符串或空串相匹配。 abc仅匹配abc。 (·*)与在‘( ’和‘)’之间的尽可能长的字符串相匹配,如匹配((first)and (second))。 ([^()]*)与以‘( ’开始和‘)’结束的最短字符串相匹配。如在上面字符串中,单匹配(first)和(second)。
2.正则表达式的匹配规则 • 正则表达式在匹配字符串时遵循下面的规则: (1) 正则表达式总是尽可能与最长的字符串相匹配。例: Th·*is与 This is a genesis匹配。 (·*)与((This) and (That))匹配。而 ([^()]*)与(out (in) side) 中 (in)匹配。 (2) 一个正则表达式不排斥另一正则表达式。 • 如果一组正则表达式由两个正则表达式组成,那么第一个表达式与尽可能长的字符串相匹配后,并不排除第二个表达式与第一个表达式已匹配部分的串相匹配。例: s.*gs与 singing songs匹配,而 s.*ing又与 singing 匹配。
(3) 空正则表达式总是代表最后那次使用的正则表达式。例如在vi程序中执行了查找字符串命令 /str1 后,想再执行替换命令,那么可使用命令: s//str2 • 空正则表达式‘//’(两个‘/’之间不留空格)代表最后使用的正则表达式str1。 (4) 在替换字符串中(用于vi等程序),符号‘&’取正则表达式所匹配的搜索字符串的值。 • 下面的替换命令 s/[0-9][0-9]*/##&##/g 在当前行用符号##将数字字符串全部标记出来。
3.加标记的括号和加标记的数字 • 可用加标记的括号将正则表达式括起来,正则表达式的匹配规则并不试图和加标记的括号相匹配,所以加括号和不加括号的正则表达式所匹配的内容是相同的。如两个正则表达式: a\(b*\)c和 ab*c匹配的内容相同。 • 加标记的括号可以嵌套,如 \([a-zA-Z]*\([0-9]*\)\) • 单纯使用加标记的括号并没有什么用处,加标记的括号一般总与加标记的数字结合起来使用。
在正则表达式中,加标记的数字“\n”取第n次出现的以“\(”开头的加括号的正则表达式所匹配的字符串。用这个方法可以取得一个字符串中的子串或交换子串间的位置。例如当你用vi编辑一个文件时,可以用底行命令在正则表达式中,加标记的数字“\n”取第n次出现的以“\(”开头的加括号的正则表达式所匹配的字符串。用这个方法可以取得一个字符串中的子串或交换子串间的位置。例如当你用vi编辑一个文件时,可以用底行命令 1,$ s/\([^,]*\),\(·*\)/\2\1/ • 将文件中所有下面格式的人员表 last-name, first_name initial • 改为下列格式 first-name initial last_name • 该命令访问文件中的第1行到最后一行(以$标记),由替换命令s搜索用正斜线‘/’相隔的前一个加括号的正则表达式所匹配的字符串,并利用后面加标记的数字交换字符串的位置。
11.4.2 排序或合并文件sort 1.sort命令用于排序: sort [-fdnbri] [+位置 [-位置] ] [-o 输出文件] [输入文件] f 表示对字母的大、小写不作区别。 d按字典排序,比较时只有字母、数字、空格和制表符才有意义。 n 按数值排序。 b当指定排序字段时,忽视作为界符的所有空白字符的值。 r表示反序。
如不指定位置选项,则排序参照的是整行。否则排序从“+位置”开始到“-位置”结束。如不指定位置选项,则排序参照的是整行。否则排序从“+位置”开始到“-位置”结束。 • 位置指示具有“m.n”的形式,其中m表示从行的起点处所要跳过的字段数,n表示还要跳过的字符数。 • 如位置指示“+2.4”表示从行首跳过二个字段,再跳过四个字符之后开始排序。位置指示符“-0.5”表示排序码从起始位置开始,跳过零个字段,再跳过五个字符之后结束。 sort -fb +1 file • 按第二字段对文件file进行排序,忽视大小写字母间的差别以及段间空格,排序结果写向标准输出。 • -o指定输出文件,如输出文件与输入文件同名,排序也能正常进行。如不指定- o选项,写至标准输出上。
2.sort命令用于合并文件 sort [-cmu] [-o 输出文件] 已排序文件… -c检查输入文件,验证是否是已排序文件,是,才产生输出。 -m如输入文件已排好序,就进行合并。 -u对有相同关键字的行,只输出一行。 • 当指定 -m(merge)选项时,sort归并已排好序的数据文件,并不再检验各个文件本身是否有序,以提高执行效率。例 sort -m sortedfile[1-4] -o sortedfile
11.4.3 抽取指定模式的行grep grep 可以在输入数据中查找包含指定模式的所有行,并将这些行写至标准输出。grep命令实际上是一个家族系列,与之相关的另外两个命令是fgrep和egrep。 fgrep (fixed character grep)表示固定字符grep,只能用于查找固定的字符串,因此即使在计算机内存有限时查找速度也较快。 grep 可以查找固定的字符串模式,也能查找带有通配符的模式,如H[a-y]*y。 egrep 功能最强,可查找比grep更复杂的字符串模式——正则表达式。
grep命令的格式 grep [-inwv] 模式 [文件…] -i(ignore)忽略大小写字母的差别。 -n(number)在输出中添加相关行号。 -w(words)用于指定只匹配完整的字。 -v(reverse)选择所有不包括指定模式的行。 grep中所用的正则表达式与vi中使用的相似,都是有限正则表达式,可以使用$ 、* 、[ 、^ 、|、( 、)和 \ 等元字符。由于正则表达式的元字符和Shell元字符部分重迭,因此习惯上都用单引号括住字符串模式。例 ls -l | grep ^. . . . . . . rw 在当前目录下列出其他用户能读写的文件。
egrep在匹配正则表达式上有扩充规则 • 对grep来说,egrep在匹配正则表达式上有扩充规则,例如, • 括号作为字符组,(ab)*匹配空串、ab、abab、ababab等。 • ‘| ’表示或,Sataday|Sunday匹配Sataday或Sunday,也可写成S(ata|un)day。 • 除了‘ * ’外,egrep还提供另外两个后操作符‘+ ’和‘ ?’: x+表示x的一个或多个出现。 x? 表示x的零个或多个出现。
11.4.4 流编辑程序sed • vi通过人机交互编辑程序,sed是从ed发展而来,它以非交互方式根据命令表自动地对文件或输入流进行编辑,然后将编辑后的行送至标准输出(原文件内容不变)。 sed [-n] -f 命令文件 [文件…] sed [-n] 命令表 [文件…] -f使sed从命令文件中读出命令。 -n不复制文本行到标准输出,除非在命令表中有显式的打印命令(p)。
sed每次读入一行,并根据命令表处理行的内容,然后将编辑后的行送至标准输出。 sed s/unix/UNIX(TM)/g file • sed命令表由一行或多行组成,每行格式为: [地址[,地址]] 命令 [参数表] • 如地址缺省,sed就处理文件中的所有行。例: sed 1,3 d file • 删去文件的第一行到第三行,标准输出流中不包括这三行。
一个正则表达式也是地址,它选择包含和表达式匹配的行,作地址的正则表达式必须用斜线定界。一个正则表达式也是地址,它选择包含和表达式匹配的行,作地址的正则表达式必须用斜线定界。 sed /DONE/ d file > newfile • 在sed中常用的命令为: d (delete)将sed所选出的文本行删去。 a(append)将一行或若干行加到当前选择的行后,如不给出地址,就加到每一行后。附加命令的格式为: [地址] a\ 加入的文本行1\ 加入的文本行2\ …. 加入的文本行n • 除了最后一行外,每一个添加行必须以反斜线结束。注意,a命令不能使用双地址。
i (insert)将一行或若干行加到当前选择的行前,该命令与a命令类似。 c (change)类似与a命令,但它用文本行替代选择行(可用双地址)。 s(substitute)格式为 [地址[,地址]] s/模式/替换串/[g] [p] 模式是一正则表达式。 g (globe)替换选择行上所有重复出现的模式。 p (print)将所有替换行送至输出,即使有- n选择项也如此。- n选项与p命令相结合,sed只输出替换行。 w file (write)将输出送至指定文件。 q sed立即退出处理。 !命令 将命令作用于没选中的每一行。 {命令…}花括号的一组命令对选择行都进行操作。
sed s /·* // file 删除file中所有以制表符(以表示)为分隔符的第一字段。 sed 3q打印输入的前三行后退出,相当于head -3命令。 sed -n /pattern/p完成与grep pattern相同的工作。 sed -n /pattern/!p相当于grep -r pattern sed -n /pattern/w file1 /pattern/!w file2 file 将与pattern匹配的行写至file1,不匹配的行写至file2。
11.4.5 模式扫描和处理语言awk • awk是一种模式查找和处理的语言,它支持面向字段或域的操作,是UNIX中功能最强的过滤器。 • awk得名于它的三个作者 Alfred V.Aho,Peter J.Weinberger 和 Brian W.Kernighan。 • awk的使用方法类似于sed,但它的操作细节主要来源于C语言,而不是文本编辑,它的语句和表达式与C类似。
awk的格式为 awk [-F 分隔符] 程序 [文件…] 或 awk [-F 分隔符] -f 程序文件 [文件…] 程序的格式为 模式 { 执行动作 } 模式 { 执行动作 }
awk处理过程 • awk每次从文件中读取一行,然后依次和每一个模式比较,如匹配,就执行相应的动作。 • 模式或动作可以缺省,模式缺省时,按动作处理每一行。动作缺省时,表示打印匹配行。 • awk能将输入行分成字段,缺省时字段分隔符是空白符(任意数目的空格符和制表符)。当有[- F 分隔符]选项时,以- F后说明的字符为分隔符。