在经过上机操作实践以及掌握Unix系统相关的基础知识之后,可以说已跨进了迈向成功的门槛。接着要登堂入室,继续专进,就必须更加深入的了解Unix基本命令的功能、使用并掌握一些必备的技巧。这一轮学习会有一定难度,需要强烈的求知欲和进取心作为源动力,因为只有“不满足才是向上的车轮”;同时也需要注重学习方法,善用前人总结的“约取而实得”的经验,巧学精进,迎难攻解,从而达到再上台阶之成效。
一、文件系统的相关命令
佛教《百喻经》中有一则三重楼的喻里,说有一个财主,见到他的邻居盖房子,三层楼盖得很漂亮,他也要盖这样的三层楼房子。见工匠在做地基,他就说不要地基,要直接盖第三层楼,因为第三层最高最漂亮。我们都会觉得这个财主很可笑,但在学习知识的过程中,我们可别老想着第三层而忽视打好地基噢!
文件系统相关的命令是操作Unix系统的基础,在《
Unix操作系统的入门与基础》一文中我们曾使用过其中的部分命令,下面就再来仔细学习这些命令的使用,继续打好今后盖“三层楼”的“地基”吧。
(一)目录管理
我们可以通过使用mkdir、rmdir与cd命令来创建、删除目录以及改变工作目录,并通过ls命令列表显示目录内容,以达到对目录的有效管理。
(1)mkdir命令的功能是创建目录,并且可同时创建多个目录,格式如下:
mkdir [-p] directory-name(s)
参数p代表在建立指定目录时,如果其父目录不存在,则一同创建。
[例]
mkdir dir1 dir2 dir3 //在当前目录下建立目录dir1、dir2、dir3
mkdir dir1/dir4 //在当前目录下的dir1子目录中创建目录dir4
mkdir –p dir6/dir7 //在当前目录下,由于不存在dir6目录,则先自动创建目录dir6,
//然后创建其子目录dir7
(2)rmdir命令的功能是删除目录,但其只能删除空目录(即目录中不包含文件),故此命令一般较少使用,在后文中会介绍一个更为常用的删除目录命令。rmdir命令的格式如下:
rmdir directory-name(s)
(3)在进行处理文件等的操作过程中难免需要在不同的目录下工作,这时cd命令就能派上用场了。cd命令的功能是改变当前的工作目录,它的命令格式如下:
cd [directory-name]
cd后面的目录可以是绝对路径,也可以是相对路径。如果cd后面不跟路径名,则是回到用户的主目录。如果大家对此处的一些概念不甚熟悉的话,请参见《
Unix操作系统的入门与基础》文中的介绍,此处就不再赘述了。下面来看几个例子:
cd dir1 //进入当前目录中的dir1子目录
cd .. //进入上级目录,即把工作目录改变成当前目录的父目录
cd ../zcl //回到父目录,同时再进入zcl子目录中
(注:上述三个命令的路径都为相对路径)
cd /home/anray //把工作目录改变成根目录中的home目录下的anray子目录
(注:此处路径为绝对路径)
此外,使用pwd 命令可以查看当前的工作目录,它显示的是当前工作目录所处的绝对路径。
(4)ls命令的功能是列表显示指定目录中文件及子目录的信息(其实在Unix系统中目录本身也被视为一个文件,但是为了照顾习惯的思维,在叙述时仍然将其区分为文件与目录两类),缺省输出顺序为纵向按字符顺序排列。它常用的命令格式如下:
ls [-altFR] [directory-name]
参数a代表显示所有类型的文件,包括文件名以“.”为第一个字符的隐藏文件。参数t代表按文件最后修改时间的顺序依次排列文件,参数R将会列出指定目录下以及其所有子目录中的文件,使用参数F将会在列表中的每一个目录后面加上“/”,在每个可执行文件后面加上“*”。参数l代表长列表显示目录内容,即列出文件的类型、访问权限、拥有者、文件大小、修改时间及名称等详细信息。下面将介绍一下长列表显示中的信息的含义,“ls –l”命令的使用如下图所示。
在上图长列表显示文件信息的每一行中,
第一列
|
第1个字符表示文件的类型;
第2-4个字符表示文件所有者对此文件的访问权限;
第5-7个字符表示用户组对此文件的访问权限;
第8-10个字符表示其他用户对此文件的访问权限;
|
第二列
|
文件的链接数
|
第三列
|
文件的所有者
|
第四列
|
文件的用户组名
|
第五列
|
文件所占的字节数
|
第六至八列
|
文件上一次的修改时间
|
第九列
|
文件名
|
注:此表格中的一些概念在下文会有详细介绍,这里只需先了解一下即可
|
(二)文件管理
1、文件的创建、编辑与删除
Unix系统中可以使用touch命令来创建新文件,它的命令格式如下:
touch filename(s)
但要指出,touch命令最常用的功能并不是创建文件,而是改变指定文件(或目录)的最后访问时间和修改时间。它的命令格式如下:
touch [-am] [mmddhhmm[yy]] filename(s)
此命令中,若指定文件不存在,则创建之;若已存在,则将指定文件的访问时间和修改时间按参数的要求进行改变。参数a代表只改变访问时间,参数m代表只改变修改时间。参数mmddhhmm[yy]中每隔两位分别表示“月日时分[年]”,用户可利用此参数指定欲设置的时间,若不带此参数,则会自动使用系统当前的默认时间。
[例] 在当前目录下创建新文件document:
touch document
将刚创建的文件document的访问与修改时间改为2005年10月1日0时0分:
touch -am 1001000005 document
大家可不要小视touch命令的此项作用,在软件的实际开发中,有时它还会与企业的客户关系管理策略或企业经济效益密切关联。倘若你所在企业的开发团队协作精神好,工作效率高,或者是改进了相关技术与流程,使原与客户合同中约定的项目完成日期大大提前,为了屏蔽用户知情,避免节外生枝,该命令就派上大用场了。这事我知你知即可,彼此只能心照不宣噢!
文件创建好之后就需要对此文件的内容进行相应的编辑了,在Unix系统中最常使用的编辑工具是vi,在后文中会有专门的章节进行详细介绍,此处先行略过。
在使用Unix系统一段时间之后,大家可能会发现文件数量正在快速增加,而其中的一部分文件可能已经变得过时,或是没有了使用价值,这时就应该及时利用rm命令将此类文件删除了。rm命令的功能是删除文件或目录,它的命令格式如下:
rm [-i] filename(s)
或 rm –r[i] directory-name(s)
使用参数i的目的是给大家一次“买后悔药”的机会。由于Unix系统中的文件一旦删除将极难恢复,因此在删除文件之前一定要慎重。而参数i的作用是在删除文件之前进行逐一询问提醒,是否确实要删除此文件。如果输入y则删除文件,若输入其他字符,文件则会被保留。使用了带参数r的rm命令可用来删除一个目录以及其所有子目录,此时不必受删除目录必须为空目录的条件限制,因此也就更具危险性,大家在使用前应当慎之又慎。
[例]
rm doc1 doc2 doc3 // 直接删除文件doc1、doc2、doc3
rm –i doc1 doc2 doc3 //在删除文件doc1、doc2、doc3时,每删除一个之前先作提示
rm -ri dir1 //删除目录dir1以及其中所含的所有文件与子目录,删除前先作提示
2、文件的查看
常用的查看文本文件的命令有cat、more、head、tail等,下面将逐一进行介绍。
(1)cat命令可以在屏幕上显示出文本文件的内容,它的命令格式如下:
cat filename(s)
不过cat最常见的用法是配合重定向符来清空文件以及将几个文件合并成为一个文件。重定向符的详细用法请参见本文第二章节的内容。
[例]
cat /dev/null > doc.txt //清空文件doc.txt,/dev/null代表空设备文件(记住使用即可)
cat < doc1.txt >> doc2.txt //将doc1.txt中的内容保存在doc2.txt的尾部
(2)使用cat命令查看文本文件时会有一个问题,就是它不会分屏显示文件,这样当文件的内容超出一屏时,除了最后一屏的内容之外,上面的内容都将是一闪而过。当然解决的办法Unix也替我们想好了,就是使用more命令来查看此类文件。more命令的格式如下:
more filename
more命令将会以分页的方式显示文本文件内容。当每次将文件内容显示在屏幕上时,如果内容超出一屏,则会在屏幕的左下部显示“--more--”,并且在其后面显示百分比表示已显示部分占总内容的比例。此后按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上一屏,按“h”字母键可以获得关于更多功能的帮助;使用“/”加上字符串可以查找指定字符串的内容信息,找到后可以按“n”字母键继续搜索下一个符合要求的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
(3)head & tail 命令
head与tail命令的格式如下:
head [-n] filename(s)
tail [-n] filename(s)
head命令的功能是显示一个或多个文件开头n行的内容,tail命令的功能是显示一个或多个文件最后n行的内容。若没有指定参数n,则系统会默认显示10行内容。
(三)文件与目录的访问权限
1、文件访问权限简介
在Unix系统中每个文件(或目录)都包含有一套权限,这些权限决定了谁能访问该文件以及如何访问该文件。通常文件有三种权限:
权限
|
普通文件的权限
|
目录的权限
|
r
|
读取文件内容
|
读取文件名称
|
w
|
向文件写入信息
|
建立和删除文件,可以改变文件名等
|
x
|
执行文件
|
使用该目录中的文件
|
在Unix系统中有三种不同的用户类型,分别是所有者(owner)、用户组成员(group)、其他用户(other)。所有者是指文件的创建者;用户组成员是指由若干个用户组成的组内成员;而除所有者、用户组成员之外的访问者,统称为其他用户。所有者除拥有相关的访问权限外,还有向另两类用户授权之权限。用户组中的成员在同组内可以共享信息,通常某一类或某一项目中的用户会被Unix系统管理员归为一个用户组,每个用户都被授予能访问同组成员文件的权限。其他用户在所有者的授权下可对文件有读、写或执行的权限。
上文中我们曾提到使用“ls –l”命令来显示文件的访问权限。如图中所示:
以文件myfile1为例:
|
所有者
|
用户组
|
其他用户
|
权限
|
rw-
|
r--
|
r--
|
含义
|
可读、可写、不可执行
|
可读、不可写、不可执行
|
可读、不可写、不可执行
|
2、文件访问权限的设置
使用chmod命令可以修改文件的访问权限,chmod命令的格式分为两种:
格式1:chmod symbolic_mode file(s)
格式2:chmod absolute_mode file(s)
(1)格式1:符号模式(symbolic_mode)的命令格式如下:
chmod who op permission(s) file(s)
参数who表示用户类型,它的内容为以下一项或多项:
u
|
文件所有者
|
g
|
用户组
|
o
|
其他用户
|
a
|
所有用户
|
参数op表示操作:
+
|
表示要增加permission指定的权限
|
-
|
表示要取消permission指定的权限
|
=
|
设置为permission指定的权限,并取消原设置权限
|
参数permission为权限类型,它的内容为以下一项或多项:
[例] 以上图为例,要为myfile1的所有者增加执行权限,用户组增加写权限与执行权限,取消其他用户的读权限,使用命令如下:
chmod u+x,g+wx,o-r myfile1 //为不同用户类型设置权限时用“,”分隔
(2)格式2:绝对模式(absolute_mode)的命令格式如下:
chmod xyz file(s)
参数x、y、z分别代表0-7的数字,用来表示所有者、用户组、其他用户对该文件的访问权限。x、y、z所代表的0-7数字的含义如下:
Value
|
permission
|
7
|
r w x
|
6
|
r w -
|
5
|
r – x
|
4
|
r - -
|
3
|
- w x
|
2
|
- w -
|
1
|
- - x
|
0
|
- - -
|
[例] 用绝对模式来完成符号模式中的例子:
chmod 770 myfile1
从对比中大家应该感受到,符号模式会更加直观一些,而绝对模式的数字含义较难记忆,因此设置文件权限时推荐使用符号模式。
(四)文件与目录的移动复制
在Window系统中,我们最熟悉的操作应该莫过于“Ctrl + C”、“Ctrl + V”、“Ctrl +X”了,因为它为我们节省了大量的时间,带来了极大的便利。而在Unix系统中同样为我们准备了cp、mv命令,利用它们可以实现剪刀加糨糊的操作了:)
1、移动或重命名文件(或目录)
利用mv命令可以将一个文件(或目录)从一个目录移到另一个目录中,也可以用于重命名一个文件(或目录)。mv命令的格式如下:
mv [-i] source-file target-file
或 mv [-i] source-directory target-directory
当target-file为文件名时,则相当于文件重命名,target-directory同理。参数i代表在将文件移动到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止移动,保留原文件。
[例]
mv beans nuts //将文件beans重命名为nuts
mv file1 file2 /tmp //将文件 file1和file2移动到目录/tmp中
mv dir1 /export/home/anray // 将目录dir1包括其所有文件与子目录都移动到目
// 录/export/home/anray下
2、复制文件(或目录)
利用cp命令可以将一个文件(或目录)从一个目录复制到另一个目录中,命令格式如下:
cp [-i] source-file(s) destination-directory
或 cp –r[i] source-directory(s) destination-directory
参数i代表在将文件复制到指定目录中时,若已存在同名文件,则将询问是否覆盖已存在的文件,输入y则覆盖,输入其他字符则中止复制,保留原文件。当复制文件到指定目录,或许会期望赋予此复制的文件不同于源文件的文件名,则只需将新文件名放在目标目录名之后,用“/”隔开即可。当需要将一个目录连同它的所有子目录一起复制到目标目录中时,可使用参数r。
[例]
cp beans apple //将文件beans复制到同目录下并改文件名为apple
cp beans apple dir1 //同时复制两个文件beans与apple到当前目录下的子目录dir1中
cp apple dir2/orange //将文件apple复制到当前目录下的子目录dir2中,并改名为orange
cp -r dir1 dir2 //将目录dir1中的所有文件以及其所有子目录复制到目录dir2中
(五)其它常用命令
1、man命令
man命令用于查看帮助信息,常用的命令格式有:
man name
或 man –k keyword
[例]
man //查看man的使用方法
man ls //查看ls命令的帮助信息
在查看帮助信息过程中,按回车键则会下滚一行,按空格键则会下翻一屏,按“b”字母键可以返回上一屏,使用“/”加上字符串可以查找指定字符串的内容信息,找到后可以按“n”字母键继续搜索下一个符合要求的内容信息,按“q”字母键则可退出并返回Shell命令提示符状态。
2、clear命令
clear命令的功能是清理屏幕,每次操作Unix系统时间长了,屏幕上的信息难免显得有些凌乱,这时clear一下是不是觉得眼前一下子“清静”了许多:)
3、date命令
date命令的功能是显示系统时间,并可修改系统时间。date命令的格式如下:
date [mmddhhmm[yy]]
date命令后若无参数,则会显示系统当前的默认时间。若要修改系统时间,则输入参数的顺序依次为“月日时分年”。如要将当前系统时间修改为2005年10月1日0时0分,则可使用如下命令:
date 1001000005
4、cal命令
cal命令的功能是显示日历。
[例1] 要查看2005年的全年日历:
cal 2005
[例2] 要查看2005年5月份的日历:
cal 5 2005
二、特殊字符的使用
先说一个事例:一次有位朋友问我有没有办法把某英语辅导软件中加密的数据搞到手,我想也没想,立刻翻箱倒柜去找出各种解密工具。大半个小时后,正在我毫无头绪之际,这位朋友跑来说自己已搞掂了这个软件的使用授权。问他,说只是给软件作者打了个电话。由此想到Unix中的一些特殊字符,往往平时操作中不曾想到去用它,而是墨守成规地进行自己所熟悉的步骤,实际上是在用那些老笨的方法。如能想到并熟知Unix中特殊字符的功能及使用技巧,就会像我这位聪明的朋友一样取得事半功倍的效果。
(一)通配符的使用
文件名是命令中最常见的参数,大家可能经常会碰到这样的情况,就是仅知道文件名的一部分,或者是想同时引用多个具有相同扩展名或以相同字符串开头的文件。Shell中提供了一套被称作通配符的符号,它们能搜索、匹配并产生一个文件名列表,通配符包括“*”、“?”、“[]”。用户执行以包含通配符的文件名为参数的命令之后,Shell会自动去搜索匹配文件并返回所发现的一个文件名列表,然后Shell就会用这些文件名作为命令的参数了。
星号“*”用于指代以特定字符串开始或结束的文件名,问号“?”代表文件名称中的单一字符,即“*”可替代文件名中任意长度的字符串,而“?”只能替代一个字符。方括号“[]”的作用是使用户确定所需搜索的有效字符集,任何在“[]”里的字符都将被匹配。此外,在“[]”中可使用“-”来指定一个字符集范围,这样就不必手动的一个个列出来了。
请看下面的例子:
假设当前目录下有8个文件doc1,doc2,doc3,docA,docB,docC,docD,document,分别对其进行如下操作:
ls doc* //显示出doc1,doc2,doc3,docA,docB,docC,docD,document
ls doc? // 显示出doc1,doc2,doc3,docA,docB,docC,docD
ls doc[13AD] // 显示出doc1,doc3,docA,docD
ls doc[A-C] // 显示出docA,docB,docC
ls doc[1-8] // 显示出doc1,doc2,doc3
(二)命令分隔符“;”的使用
有时某些用户可能想在一行中运行多个命令,那么可以在这一行中输入多个命令,命令间用“;”相隔,如:
mkdir tmp; cp file1 tmp/file2; ls -l tmp
Unix会顺序执行以上三条命令,要注意的是在命令间使用分隔符“;”,只代表命令执行的先后顺序。
(三)重定向符的使用
用户欲执行一个命令,当然是要先输入此命令,系统默认的标准输入设备是键盘,而执行命令后的结果通常显示在系统默认的标准输出设备显示器上。但是,Unix系统具有重定向功能,即将标准输出重定向则可将命令的处理结果存入指定的文件,而非显示在屏幕上;将标准输入重定向则可把指定的数据文件作为输入源,而非从键盘输入数据。
重定向符如下:
<
|
从一个文件或设备重定向输入
|
>
|
重定向输出到一个文件或设备,如文件不存在则创建该文件,如文件已存在则覆盖该文件
|
>>
|
重定向输出到一个文件或设备,并将输出信息追加到已存在文件的尾部
|
例如:
cal 5 2005 > doc1.txt //将2005年5月份的日历保存在文件doc1.txt中
cal 6 2005 >> doc1.txt //将2005年6月份的日历保存在文件doc1.txt尾部
//此时文件doc1.txt中保存了5、6两个月的日历
cat < doc1.txt > doc2.txt //将doc1.txt作为输入源,把其中的内容保存在doc2.txt中
(四)管道符“|”的使用
有时可能会需要将一个命令的标准输出发送给另一个命令使用,而非发送到一个目标文件,这时就需要使用Unix提供的管道符“|”在这两个命令间架起一条连接管道。管道符“|”的作用就是从“|”左边的命令接受输出数据并发送给“|”右边的命令作为输入数据。
如:ls -l /etc | more
管道符“|”的功能非常强大且很有用,利用它可以实现一些复杂的操作。在下一节关于信息查找命令部分,我们将会看到它的一些应用。
(五)其它特殊字符
美元符“$”是一个特殊操作符,当其置于变量名前面时,变量名会被变量值所代替。因此通常都是通过在变量名前加上“$”来引用该变量的值,“$”也常被称为变量取值符。
Unix中可以使用三种引号符:
(1)单引号(’ ’):功能是让系统原样输出单引号中所含的内容。
(2)双引号(“ ”):双引号中的字符串若含有通配符,则系统会先进行通配后再输出;若含有变量取值符“$”,则系统会先进行变量取值后再输出。
(3)反引号(` `):反引号中所含的内容必须是一个命令,这样它会先执行此命令,然后把命令执行的结果返回输出。
对于上述几个特殊字符,在下文关于Shell脚本编程部分大家会看到具体的应用例子。此外,常见的特殊字符还有“.”代表用户所在的当前目录,“..”代表用户所在的当前目录的父目录,“~”代表用户登陆系统的主目录。
Unix的轻巧“约取而实得”(中篇)
三、与查找比较相关的命令
使用Windows系统的用户可能都有这样的经历,在网上看到可悠长品赏的电影,down;看到匠心独运的电子书,down;看到妙织锦绣的文章, down;看到衔华佩实的资料,down。但时间一长,想再回顾一下《星战前传3:西斯的反击》中奥比旺和阿纳金在熔岩横流的穆斯塔法星上展开光剑对决的精彩片段,或者是重温一下李开复先生给中国学生第四封信中所提出在大学校园应当掌握的“七项学习”,可能自己都记不清当时是放在哪个目录里了。幸好, Windows为我们提供了“搜索”功能,再加上现今Google、百度相继推出的Google 桌面搜索、百度硬盘搜索,才使得这些文件幸免于藏身深宫大院之中,茕茕孑立、形影相吊的命运。那么在Unix系统中的文件又是怎样的命运呢?且看以下的命令功能:
(一)利用find命令查找文件
find命令的功能是在指定目录及其子目录下查找符合条件的文件,命令格式如下:
find path expression
参数path指欲开始查找的起始目录,find会遍寻此目录以及其子目录,并且此参数可以有多个目录名称,只要在目录与目录之间用空格分开即可。参数 expression指明了诸如基于文件名、文件类型、文件所有者、最后一次修改时间等的查找规则,find命令将遵循此查找规则来查询指定目录以及子目录中的文件。
常用的查找规则如下:
-name filename
|
指定要寻找的文件或目录名称
|
-print
|
将搜索到的符合条件结果以包含路径名的方式输出
|
-type x
|
以文件类型作为寻找条件,常用的文件类型
x如下:
d --- 目录文件, f --- 普通文件, b --- 块设备文件, c --- 字符设备文件, l --- 链接文件
|
-user user
|
寻找用户user所拥有的文件,user可为用户名或uid号
|
-atime n
|
寻找
n天之前曾被访问过的文件
|
-mtime n
|
寻找
n天之前曾被修改过的文件
|
-exec command {}\;
|
用寻找到的文件作为执行command的对象,{}中保存执行command时所需的参数,注意必须以 \; 为结束
|
下面来看一些具体的查找实例:
[例1] 在目录/home中查找名为javac的文件,并要显示出完整的路径名:
find /home –name javac -print
[例2] 在当前目录下查找以doc开头,7天之前曾被修改过的文件:
find . –name “doc*” -mtime 7
[例3] 在目录/home中查找名为anray的目录,并显示出完整的路径:
find /home –name anray –type d -print
[例4] 在目录/home中查找用户zcl所拥有的普通文件,并将其删除:
find /home –type f –user zcl -exec rm {} \;
(二)使用grep命令查找字符串
使用grep命令在文本文件中查找指定的字符串,并将所有出现该字符串的行打印显示出来。grep命令的格式如下:
grep [-iv] 字符串 文件名
参数i代表查找字符串时忽略字母大小写,参数v显示出所有不包含指定字符串的行。如果在欲查找的字符串中包含有空格,那么应该用单引号将此字符串引起来。此外,如果是想同时在多个文件中查找指定的字符串,那么只需列出所有欲搜索的文件即可,这样grep命令会在所列出的匹配行前加上文件名。grep常与通配符、管道符一起搭配使用,这样可以实现一些特殊的查找功能,大家应能结合上面所介绍的命令来综合应用。
[例1] 在文件file1中查找字符串“Java Web”,并忽略大小写。
grep –i ‘Java Web’ file1
或 cat file1 | grep –i ‘Java Web’
或 grep –i ‘Java Web’ < file1
[例2] 在当前目录中查找5月1日创建或修改过的文件。
ls –la | grep –i ‘may 1’
(三)比较两个文件的内容
在Windows系统中,不知你是否用过一款名为WinMerge的软件?此款软件一项非常强悍的功能,就是可以比较两个文件的内容有哪些不同之处,而且可谓是火眼金睛。记得笔者读研一的时候,听一位助教说他就是靠这款软件逮了不少抄袭作业的人:)而在Unix系统中,则无需借助第三方软件就可实现此项功能了。cmp命令可用于比较两个文件,这两个文件可以是文本文件也可以是非文本文件。在默认情况下,cmp命令会显示两个文件第一次数据不同的位置;若两个文件内容相同,则不显示任何信息。cmp命令的格式如下:
cmp [-l] 文件名1 文件名2
参数l代表标示出每个不同之处内容的行号。
另外,还可以使用diff命令来比较两个文本文件或目录的不同之处,它会详细的列出文件1比文件2增多的内容、减少的内容以及改变了的内容。diff命令的格式如下:
diff [-r] 文件1 文件2 //如果比较两个目录的不同之处,加上参数r
在得到的结果中,d表示文件1比文件2增多的内容,a表示文件1比文件2减少的内容,c表示文件1较文件2改变了的内容。
(四)使用wc命令进行统计
大家一看到wc这个词,不知道是否会产生方便的感觉,呵呵。在Unix系统中,wc可是个非常有用的命令。对于Word中的字数统计功能,大家应该非常熟悉,利用它可以统计出一篇文章中的页数、字数、字符数、行数等信息。而wc命令也同样实现了类似于Word的字数统计的功能,它把一个文件作为数据流读入,然后计算出此文件中的行数、单词数以及字符数,并输出这些统计数据。wc命令的格式如下:
wc [-lwc] filename(s)
参数l代表统计行数,参数w代表统计字数,参数c代表统计字符数。
wc -l file1 file2 //统计文件file1和file2 的行数
grep wang /etc/passwd | wc –l //统计目录/etc下的passwd文件中有多少个用户名为wang的用户
四、文件归档及压缩命令
(一)文件归档命令
用户在处理文件过程中,有时需要对某些目录及文件进行打包备份的操作,或有时需要将几个文件组合成一个文件以便于网络传送,就像减肥瘦身了的五、六个美女挤坐一辆出租车一样,这时Unix系统提供的tar命令就能有用武之地了。使用tar 命令,可以将多个文件或目录合并成为一个tar包以便于存储及传输。tar命令的常用格式是:
tar cvf filename.tar file1 file2 …directory1 directory2 …
此处参数中c表示创建一个新的归档,v表示启动显示模式,tar会显示出所处理的每个文件名,f filename.tar表示使用指定的文件名作为归档文件。
如:要将/home/zcl/down目录中的文件全部归档为down.tar,可以使用如下命令
tar cvf down..tar /home/zcl/down
当用户想把已归档的文件复原,则可使用如下的命令格式:
tar xvf filename.tar
(二)文件压缩命令
为了避免文件占用太多的磁盘空间,用户会选择将文件压缩存放。通常压缩会和归档组合使用,使用户能够对整个目录以及目录中的文件同时进行压缩。对许多 Windows用户来说,使用Winzip、Winrar等工具软件来压缩或解压文件是很平常的事,那么如何在Unix系统中对文件进行压缩与解压呢?下面介绍Unix系统中常用的三种压缩类型以及解压缩命令。
1、使用gzip/gunzip 命令解压缩文件
使用gzip命令压缩后的文件名称为“原文件名.gz”,它对应的解压命令是gunzip。命令格式如下:
gzip filename
gunzip filename.gz
如:要largefile.tar文件压缩成为largefile.tar.gz,则可以使用如下命令
gzip largefile.tar
如果要把largefile.tar.gz解压,则只需使用命令gunzip largefile.tar.gz即可。
2、使用compress/ uncompress命令解压缩文件
凡是经过compress命令压缩处理的文件,会在文件名后附加上“.Z”,它对应的解压命令是uncompress。命令格式如下:
compress filename
uncompress filename.Z
3、使用pack/unpack命令解压缩文件
凡是经过pack命令压缩处理的文件,会在文件名后附加上“.z”,它对应的解压命令是unpack。命令格式如下:
pack –f filename
unpack filename.z
五、进程管理与控制命令
“进程”顾名思义就是“正在进行着的程序”,在Unix系统中一个进程可视为一项正在执行的任务,这样一个命令也就是一个进程了。Unix系统具有检查和控制进程的相关命令,它们常被用于管理Unix系统。事实上,进程不仅包括用户所执行的命令,也包括了维持Unix系统正常运行的所有程序,且每一进程都有其唯一的代号,即进程标识符。
要想查看系统当前正在运行的进程信息,可使用命令:
ps [-options] //无参数时只显示当前用户在当前窗口中所运行的进程
//如果系统提示ps为非法命令,则在csh中可使用/usr/bin/ps,
//bash中可使用/usr/ucb/ps来替代ps
参数
|
解释
|
-e
|
列出所有正在运行的进程
|
-f
|
长列表显示进程的细节信息,一般与e一起使用
|
-u 用户名
|
显示指定用户正在运行的进程
|
如:要求长列表显示所有与用户zcl相关的进程信息,命令如下:
ps –ef | grep zcl
此外,如果想要查看进程占用系统资源的情况,可使用如下的两个命令:
/usr/ucb/ps –auwx //查看进程占CPU、内存等系统资源的情况
prstat //时时刷新当前系统的进程信息,并按所占系统资源大小排列
在某种特殊情况下,用户可能会无法正常的结束某一进程,这时就需要使用命令kill来杀掉这一进程,不过要注意的是用户只能杀掉由其自身创建的进程。命令格式如下:
kill [-signal] process-id
或
pkill [-signal] process-name
kill就像一名狙击手,实施的是精确的“点杀”,kill会精确的杀掉指定进程号的进程,如:
kill 12345 //“点杀”进程号为12345的进程,进程号可利用ps命令查出
kill -9 12480 //-9代表强制杀掉进程,但不会清理该进程所占的资源
pkill就像一名机枪手,实施的是威力巨大的“群杀”,pkill会杀掉所有指定的进程名的进程。如:
pkill sleep //杀掉系统中所有名为sleep的进程
这里,我们再引入一个新的概念——作业。作业这一概念只有在需要对进程区分为前后台时方被使用,它等同于进程的概念。前台进程是指可以和用户直接进行人机交互的进程,它可以接收键盘输入并将结果显示在显示器上。缺省状态下用户启动的Unix程序都运行在前台。后台进程是指不直接和用户进行交互的进程,用户一般是感觉不到后台进程的运行。要让某一程序在后台运行,只需在命令行的最后加上“&”符号。在Unix系统中可以同时在前台和后台运行多个进程,通常情况下,一般把需要和用户交互的程序放在前台执行,而把不需要以交互方式执行的程序置于后台运行。
使用jobs命令可以查看当前系统中正在执行的作业,如下图所示:
在图中,“[]”中的数字代表作业号,此作业号可以配合作业管理命令一起使用:
fg %n
|
将某一作业放入前台运行(n代表作业号,下同)
|
bg %n
|
将某一作业放入后台运行
|
stop %n
|
挂起后台某一作业
|
kill %n
|
终止某一指定的作业
|
此外,还应掌握三个常用的键盘指令:
Ctrl + z
|
挂起前台正在运行的作业
|
Ctrl + d
|
正常的结束前台作业,即先执行完该进程后结束
|
Ctrl + c
|
终止前台作业(非正常方式)
|
如:
[例1] 要求后台运行find命令,在当前目录及其子目录下查找文件名前缀为file的文件。
解:通常当在后台运行命令时,最好将其运行结果输出重定向到一个文件中,以便日后检查或校对。因此,此题可以使用如下的命令:
find . -name “file*” >myfind &
这样,我们就可以通过查看myfind文件来查看查找结果了。在运行此命令的同时,我们还可以继续输入其它命令来进行其它操作。
[例2] 要求前台运行find命令,在当前目录及其子目录下查找文件名前缀为file的文件,运行过程中挂起进程,并将其放入后台运行。
解:此题可以使用如下的命令:
find . -name “file*” >myfind
^z (按Ctrl + z)
jobs //通过jobs命令来查看find进程的作业号,假设为1
bg %1
这里再补充与记取一个小知识点,即当在前台杀掉某一进程后,那么此进程的所有子进程都会同时被杀掉;而如果是在后台杀掉某一进程,那么此进程的所有子进程都将“过继”给“祖宗”进程(即进程号为1的进程)而继续运行。