Linux系统命令精通指南
针对Linux初学者的系统命令简介
对于文件命令,我们在此处详尽讨论了某些相当简单和直观的管理命令。而只描述了其他较复杂命令的功能,以便在您需要使用时,知道存在这些命令及其用途。本文不涉及对每个命令使用背后的基本原理的详细讨论,但是我们将讨论最基本和最有用的命令,这些命令用于监视和管理打印机服务、文件系统、磁盘和进程。
有关超级用户的更多信息
这里讨论的很多命令可以由常规用户在其自己的文件和进程中执行。但是,某些命令,如fdisk,需要有root权限才能运行。
为了您的系统的完整性,建议您避免直接以"root"登录到系统中。相反,通常更适合以常规用户登录,然后执行su或从X window执行sux命令来运行系统管理功能。( Sux为您提供X window环境以及root权限。)当您以root用户登录时,您会始终知道您处于这种状态,因为您的提示符变为 “#” 。
超级用户能够使用sudo,有选择地将那些通常为root用户或其他特殊用户所保留的权限分配给一个不同的常规用户。root用户可以定义实际和有效的用户和组标识号uid和gid,以便与预期用户的标识相匹配。这种预期用户可以是(但不必是)被允许运行该命令的用户。
换言之,超级用户可以允许其他用户执行某个命令,但也可以确定由进程所产生的任何结果文件应该属于root用户或任何由超级用户指定的其他用户。Sudo权限一经分配,则只需要用户使用自己的口令进行验证,而不需要root用户口令。
通用命令
从技术上讲,Uname、diff、date、sort和uniq应该看作文件命令,但由于它们经常用于诊断和维护例程的系统管理方面,在这里解释它们更有意义。
Uname
Uname提供了常规系统信息。当指定-a选项时,显示所有可用信息:
$ uname -a
Linux linux2.4.18-4GB #1 Wed Mar 27 13:57:05 UTC 2002 i686 unknown
在这里我们从左向右看到常规的系统信息。每条信息都有自己的选项(在下面的圆括号中),可以单独显示:
· 操作系统名称为Linux(-s)。
· 本机的网络节点名为linux (-n)。
· 操作系统发布版本为4.5.18-4GB (-r)。
· 操作系统版本为#1 Wed Mar 27 13:57:05 UTC 2002 (-v)。
· 机器类型为i686 (-m)。
· 这里的处理器类型(-p)为未知。
类似地,stty显示关于您的终端设置的信息:
$ stty -a
speed 38400 baud; rows 40; columns 103; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; start = ^Q;
stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts -ignbrk -brkint -ignpar -parmrk -inpck
-istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke
第二行和第三行显示了将在命令行分别调用的特殊字符和键序列。例如,"^Z"即CNTRL-Z在本系统中发送一个终端休止符。退出符号以"^\"即CNTRL-\发送,而我们可以将其改为"^X",如下所示:
$ stty quit ^X
在这种情况下,您实际要输入^符号,而不是CNTRL键。这种改变只在当前窗口中起效。为了使这种改变永久生效,需要在您的.bashrc文件中输入该语句。
Diff和Date。顾名思义,Diff比较两个文件。它返回那些导致文件不同的行,并返回关于如何使文件变得相同的一些含义隐晦的输出:
$ diff test.out test2.out
0a1
> Another test.
在这里我们被告知,需要将"Another test."这一行添加到test.out,以便使它与test2.out相似。第一个字符"0"是要在test.out中编辑的行号;"a"表示该行应该被添加到test.out,以便与test2.out的第一行"1"相匹配。如果我们需要更改test.out,则第二个字符也可以是"c",而如果我们需要从test.out中删除一些内容,则第二个字符是"d"。
您可能希望使一个文件与另一个文件相似,以便为某些代码提供补丁。diff还经常作为分析工具,用于验证程序或脚本 — 例如sed脚本 — 的输出是否是所预期的输出。
date命令可用于显示或设置日期。如果用户具有超级用户权限,则他或她可以通过在以下命令中提供一个数字型字符串来设置日期:
$ date 0101010004
此命令将日期设置为2004年(04) 1月1日(0101)凌晨1时(0100)。
但是,任何用户可以用所需的格式来显示日期。注意在格式序列之前需要一个加号"+"。如果没有出现此命令的预期输出,则尝试将它包含在单引号中:
$ date +'%H%M%S'
204748
您可以在序列中包含空格,这时您需要使用双引号:
$ date +"%H %M %S"
20 47 51
在日期的主页上列有三十多种不同的格式序列,这些序列可以按需要结合起来,以获得您最后的输出格式。
date的输出还可以用于脚本中,如:
$ date -d '2 day'
Thu Jan 29 19:02:02 EST 2004
-d选项指示date显示其后字符串中所描述的时间。在上例中,我们要求显示从现在起(2004年1月27日)两天后的日期。我们也可以要求显示三天前的日期,其命令为:
$ date -d '-3 day'
Sun Jan 25 20:56:59 EST 2004
date多种功能的另一个示例是能够向其输出附加字符串,为生成唯一的文件名提供了一种便利的方法。
$ ls -l | cat > $(date +ls_%d%b%y%H%M.out)
$ ls ls_*.out
ls_04Feb041633.out
在这里,我们将一个长文件列表的输出传送给cat,它将我们的输出再传送到一个名为ls_04Feb041609.out的文件。注意我们为文件名使用了一个变量,由美元符号"$"表示。依次将"ls_"和".out"附加到日期,其格式为月份中的日(%d)、本地的月份名称缩写(%b)、年份的最后两位数字(%y)、小时(%H)和分钟(%M),从而产生此文件名。
Sort和Uniq。您可以从管道或从命令行所指定的文件对文本文件的行进行sort操作。除非另外指定,sort对多列输出的第一列进行操作。在默认情况下,除非使用-n选项,数字型的列按字母顺序排序。
Sort列可以用两种不同的格式指定。如果使用-k选项,则列的位置从1开始进行编号。您还可以使用+POS1格式,从第一列编号为零开始进行列的编号。以下两个命令产生相同的输出:
$ ls -l *.out | sort +5 -7
$ ls -l *.out | sort -k 6,8
-rw-r--r-- 1 bluher users 375 Dec 5 2002 fdisk.out
-rw-r--r-- 1 bluher users 2447 Dec 28 20:15 ls.out
-rw-r--r-- 1 bluher users 590 Jan 4 21:24 greps.out
-rw-r--r-- 1 bluher users 78 Jan 4 21:25 sgrep.out
...
在默认情况下,sort命令的列分隔符是空格和制表符。可以使用-t SEP选项指定其他分隔符,其中SEP是您指定的分隔符号。sort的默认顺序是从最低到最高,利用-r选项可以将顺序颠倒。
Sort可用于很多不同的任务。例如,它可用于对文件输出进行排序(如/etc/passwd),或者如我们在下面所看到的那样,对du的输出进行排序。当使用-m选项时,sort将文件合并,实际上并没有对它们进行排序。但是,如果您希望将它们排序,就应该在文件合并前对它们排序。
Sort经常与uniq命令一起使用,从已排序的文件中删除完全相同的行。uniq命令在管道中经常跟在sort命令的后面,还可以使用-c选项来计算某一行所出现的次数,或者使用-d选项,只报告完全相同的行:
$ sort -m test.out test2_sort.out | uniq -c
1 Another test.
1 Testing testing
2 This is a test.
在这里我们合并两个文件test.out和test2_sort.out。然后我们使用-c选项,将输出传送到uniq,这样最后的结果是按字母顺序排列的列表,完全相同的行被删除,并带有一个关于每行出现频率的报告。
打印机控制
在多数情况下,打印机命令的使用相对较为明确。通过在lpr命令后面指定文件名,将作业发送到打印机。如果没有提供文件名,则假定使用标准输入。使用lpq命令,您可以获得关于发送到打印机的作业的状态报告。当您指定作业号时,Lprm将作业从行打印机后台打印队列中删除。
$ lpr grep2.out
$ lpq
Printer:lp@linux 'lpdfilter drv=upp method=auto color=yes'
Queue:1 printable job
Server:pid 1929 active
Unspooler:pid 1930 active
Status:waiting for subserver to exit at 21:24:14.637
Rank Owner/ID Class Job Files Size Time
active bluher@linux+928 A928 grep2.out 779 21:24:14
done bluher A 877 (STDIN) 117258 13:09:53
$ lprm 928
Printer lp@linux:
checking perms 'cfA928linux.local'
dequeued 'cfA928linux.local'
在这里,当我们将作业发送到打印机后,我们查询其状态。Lpq向我们显示编号为877的作业已经完成,而我们刚发送的作业编号为928。我们使用命令lprm 928将活动的作业从队列中删除。
磁盘信息
无论您是维护自己的系统还是支持具有很多用户的企业,监视磁盘空间都是系统管理员更重要的职责之一。du、df和fdisk命令提供了可用磁盘空间的不同视图。
du命令提供对每个目录的文件空间使用情况的评估。在默认情况下,测量的单位是块的数目,块的大小通常在安装您的系统时确定。
在以下的示例中,系统是使用1024字节的块安装的。如果没有指定目录,则du开始对当前目录进行计算。-h选项以易于读懂的形式提供大小的值:
$ du -h Documents
105k Documents/jj
573k Documents/John
682k Documents
可以使用-a选项更改输出,该选项指示du显示文件和目录的块数。选项--block-size=SIZE指示du以SIZE所指定字节大小的块的数目来显示输出。
$ du --block-size=512 Documents
209 Documents/jj
1146 Documents/John
1363 Documents
在默认情况下,du还为每个子目录递归地打印信息。通过使用max-depth=N选项可以限制这种操作,其中N等于被报告的最大级数:
$ du --max-depth=2 .
$ du --max-depth=2 | sort -n
4 ./.xemacs
4 ./public_html
105 ./Documents/jj
573 ./Documents/Ian
682 ./Documents
2420 ./jdevhome/system
8350 ./jdevhome/system