LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4663|回复: 27

我的RHCE课堂笔记整理(2)

[复制链接]
发表于 2003-3-5 17:46:34 | 显示全部楼层 |阅读模式
单元五:文件访问许可

所有文件都有一个拥有者(owned by a user),并和一个组(group)相连。
因此一个用户是否有权限读写或者执行一个文件,是由这个文件是否被赋予了相应的权限所决定的。权限可以设定给文件拥有者,文件所在的组,或者其他任何人。

可由ls -l 命令来查看文件权限(permissions):
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login

可以看到文件的访问权限由10个字符表示。

文件访问权限为三种用户种类使用。每个种类都有一个表示字符:
u ——文件的拥有者(owner)
g ——文件所在组的其他用户
o ——任何用户(others)
每个种类的访问权限都彼此独立,互不相关。

三种标准文件访问类型:
r ——文件的读权限/罗列目录内容的权限(list a directory's contents)
w ——文件的写权限/在目录中建立或删除文件的权限
x ——文件的执行权限/访问目录中文件的权限,例如cd 到该目录
此三种标准文件访问类型可以赋给上述的三种文件访问权限的用户种类,即u、g、o。

文件访问权限中,第2、3、4个字符表示了文件拥有者的权限;第5、6、7个字符表示了文件组的权限;第8,9,10个字符表示了其他用户的权限。例如:
$ ls -l /bin/login
-rwxr-xr-x 1 root root 19080 Apr 1 18:26 /bin/login

说明了该文件的拥有者可以读写并执行该文件,其他的用户(包括组内用户)可以读、执行该文件。又例:
$ ls -l README
-rw-rw-r-- 1 andersen visitor 2948 Oct 11 14:07 README

该文件可以由visitor组内的用户读写,但是并不能执行;能被其他用户读,但是其他用户不能改写它或者执行它。

文件访问权限中的第一个字符"d"将目录和其他文件予以区分:
$ ls -ld /bin
drwxr-xr-x 2 root root 4096 Apr 20 18:13 /bin/

更多例子:
用户fred 是组fred 和组staff 的成员
用户mary 是组mary 和组admin, staff 的成员
文件fileA 拥有者是fred,拥有者组是 fred
文件fileB 拥有者是mary,拥有者组是 root
文件fileC 拥有者是root,拥有者组是 staff
给出下表
----------------------------------------------
user fileA fileB fileC
----------------------------------------------
fred u,g,o o, o,g
mary o u,o o,g
root u,g,o u,g,o u,g,o
如果fileA 有访问权限rwxr-xr--,那么它访问权限如下:
read write excute
------------------------------------
fred yes yes yes
mary yes no no
root yes yes yes

改变文件权限用chmod 命令,chmod 后跟一个表达式,表达式可以为一串数字或者一段预置的代码组合:改变谁的(who),操作符(operator)和权限(permission)。

改变谁的(who)可以有下面的选择:
u 文件拥有者
g 在文件组内的用户
o 其他用户
a 所有用户

操作符(operator)可以有下面的选择:
+ 增加权限
- 删除权限
= 将权限赋予…

权限(permission)可以有下面的选择:
r 读
w 写
x 执行(对于目录来说是访问)
s Set userID bit(第四位)或者set groupID bit(第七位)
t Set sticky bit(对于目录来说便是——防止其他非拥有者删除目录中的文件,位于第10位)

例如:
$ chmod g+w .bash_profile
该命令将写权限赋予了文件组内的用户。

$ chmod go-rw .bash_profile
该命令剥夺了非拥有者用户的读写权限。
chmod 中有一个有用的参数为-R (递归,注意大写),可以将整个目录中的文件和子目录的权限全部改写。

前面提到还有一种方法可以修改文件权限,就是数字方式。以三个数字的方式确定文件的访问权限。第一个数字代表拥有者权限、第二个代表文件所在组内的用户权限、第三个代表其他用户权限。权限表达式由以下数字相加而得:
4 (读权限)
2 (写权限)
1 (执行权限)

例:设置文件file 为所有人均为只读权限:
$ chmod 444 file
例:设置文件file 为拥有者拥有读写和执行权限,组内用户有读和执行权限、其他用户无任何权限:
$ chmod 750 file

还要提一下默认的文件权限。默认的文件权限,是由umask 来决定的。非特权用户的umask 为002,即文件默认权限为664;而root 用户的umask 为022,即文件默认权限为644。

如果没有umask 的话,所有文件都会默认为666权限,意味着所有人都可以读写新建的文件。注意所有新建的文件都没有执行权限,即使umask 也无能为力。所有的执行文件都要显式的给出执行权限才能运行。但是对于目录来说,无论umask 的值是多少,新建目录时就默认赋予了执行权限(可以访问目录)。

要改变umask,只需打:
$ umask 022
这样就使得原本默认的002 umask值改为022。但是当下次再登录的时候,umask 又会改回到原来的值,这就需要你在bash 的初始化脚本(initialization script)中加入特定的umask 值。

除了三种标准访问权限外,还有前面提到过的三种特殊权限。它们是setuid、setgid 和sticky 位。

(下面我的理解不知道正确与否,希望高手指点!)
setuid 位将进程的用户ID (user ID)设置为文件的用户ID,对目录无效。
setuid 是一个非常强大也很危险的工具。比如,如果一个程序设置了setuid 位而且它的拥有者是root,那么当该程序执行时它就拥有了root 用户执行这个程序的特权。有些程序必须使用它来使程序正确运行。比如ping 程序必须设置setuid 为root,因为它要在网络上传输ICMP包的裸数据。任何setuid 的程序必须小心编写并排除安全漏洞。

setgid 位将进程的组ID (group ID)设置为文件的组ID,对目录来说,它迫使所有在该目录中创建的文件都拥有与该目录相同的组,而无论文件的创建者是谁。
setgid 和setuid 一样,也很强大,应该小心使用。因为它允许无意识的对文件和资源的访问。举例来说,minicom 终端模拟器程序设置setgid 为uucp 组,它提供了向计算机的串行口访问的权限(组uucp 拥有该种权限)。

sticky 位作用在目录上,防止用户删除它们并不拥有的文件(files they do not own)。sticky 位典型的应用便是在/tmp 目录中,防止用户删除彼此的文件。sticky 位在文件上没有效果。

单元六:Linux文件系统

文件和目录被组织在一个单根(single-rooted)反向树状结构中。包括独立的物理设备卷,比如软盘、CDROM或多个硬盘。反向树状结构的基点(最高点)为根目录或者叫"/"。
文件名是大小写敏感的,"/"符号为界定符,分开路径名的各个元素。例如 /usr/bin/X11/X
每个shell 和系统进程都有一个“当前目录”。".."表示当前目录的上一级目录,"."表示当前目录。文件或者目录以"."开头的是所谓的隐藏文件,它们在默认的罗列中不出现。
一个用户的路径(path)是一串目录,用以搜索执行命令的程序所在。

/(root)
______________________________________________|______________________________________
| | | | | | | | | | | | | | |
etc bin sbin lib root usr mnt var boot tmp opt dev home proc lost+found

bin: 用来储存用户命令。/usr/bin 目录也存放用户命令。
sbin: 系统命令例如shutdown 之类的所在。/usr/sbin 目录也存放许多系统命令。
root: 超级用户的home 目录。
mnt: 通常在系统启动以后含有文件系统装载的装载点(mount point)。
boot: 含有在系统启动时所用到的内核和其他文件。
lost+found: fsck 使用用来存储找到的文件碎片(无文件名的文件)。
lib: 含有许多在/bin 和/sbin 下的程序所用到的库文件。/usr/lib 目录下含有更多的库文件。
dev: 存储设备文件。
etc: 含有许多配置文件和目录。
var: 存储像系统日志和打印池等“变量”文件。
proc: 一个含有系统进程信息的虚拟文件系统(不存储在磁盘上)
tmp: 一个用户和程序的“草稿本”,/tmp 对所有人和所有进程开放读写权限。
opt: 类似StarOffice 这种第三方包的安装目录。

以下是关于ext2/ext3 文件系统的细节。

当ext2/ext3文件系统建立时,系统的元数据(metadata)就存储在超级块中(superblock)。因为这些数据对于操作文件系统来说至关重要,所以同时也建立了一份文件系统超级块的拷贝。(比方在小的文件系统上每8192个块建立一份拷贝)。dumpe2fs 命令可以查看超级块上的数据。超级块(superblock)含有文件系统的元数据(metadata):卷名,UID,inode数,块数,保留块数,块组的位置等等。

inode 就像数据在块上的描述。inode 不存储文件的真实数据,而是存储文件的信息。stat 命令可以帮助我们查看文件的inode 从而得知是如何存储在文件系统中的。
$ stat passwd
File: "passwd"
Size: 1129 Blocks: 8 IO Block: 4096 Regular File
Device: 306h/774d Inode: 214057 Links: 1
Access: (0644/-rw-r--r--) Uid: (0/root) Gid: (0/root)
Access: Sat Sep 29 13:34:57 2001
Modify: Sun Sep 23 17:12:41 2001
Change: Sun Sep 23 17:12:41 2001

下面是硬连接(hard link)的概念。
硬连接是一个在文件系统中“物理存在”的文件,每个link 指向文件的inode。它使得一个文件拥有两个或以上名字成为可能。注意,用户可以link 他们不拥有的文件,但是还是会被inode 上的信息所限制。hard link 经常作为输入长路径名的一种节省办法。
hard link 不能跨盘或者跨分区操作,这是因为hard link 指向的inode 在一个分区内是唯一的,但是在整个文件系统中并不唯一。且不能为一个目录建立hard link。
使用ln filename [linkname] 来建立hard link。
使用ls -i 显示当前目录中所有文件的inode 号。
使用ls -l ,在第二列显示了该文件的hard link 个数。当一个文件的hard link 的个数为0,那么它已经被删除。

下面是软连接(或者符号连接)的概念。
软连接(symbolic link)是一种linux 文件类型(l)。"l"会出现在文件访问权限的第一个字符。
和hard link 不一样,它存储了它指向的另外一个文件的完整文件名。如果那个被指向的文件被改名了或者删除了,那么这个symbolic link 就没有指向。因此,symbolic link 也可以指向实际不存在的文件。此外symbolic link 也可指向跨分区的文件和目录,这两点是hard link 所做不到的。
使用ln -s filename [linkname] 建立symbolic link。
使用ls -l 可以查看symbolic link 的指向。例如:
$ ln -s /etc/passwd password
$ ls -l password /etc/passwd
lrwxrwxrwx 1 doug doug 11 May 19 18:41 password -> /etc/passwd
-rw-r--r-- 1 root root 919 May 13 19:07 /etc/passwd

symbolic link 总是有完全访问权限777。并且注意文件大小,11字节,正好是"/etc/passwd"这些字母数。

关于可移动介质,它们在被使用前必须先装载(mount)——使用mount 命令。同样地,在可移动介质被拿走之前,必须先卸载(unmount)——使用umount 命令。例如:
mount -t vfat /dev/fd0 /mnt/floppy ——装载一张软盘
mount /mnt/floppy ——利用fstab 装载软盘
mount -t iso9660 /dev/cdrom /mnt/cdrom ——装载CDROM
mount /mnt/cdrom ——利用fstab 中的信息装载CDROM

此外如果你安装了AutoFS 的rpm 包,那么你的系统就可配置成自动装载的。缺省的配置文件在/etc/auto.master 和/etc/auto.misc 中。

如果你安装了mtools 包,那么它可以帮你访问FAT 文件系统,可以在不用装载的情况下使用FAT 格式的软盘或者硬盘。命令就是m后跟dos命令。例如mdir。

搜索文件方面,linux 提供了slocate 命令和find 命令。
slocate 命令没有find 那么强大,但是很快。因为它使用了系统的一个每天更新的数据库,而不是像find 一样即时查找。find 更灵活,你可以用上多种参数和选项,并指定如文件类型、拥有者、修改日期等。

slocate 语法:slocate [pattern] 或者 locate [pattern]
注:在Red Hat Linux 系统中,locate 是slocate 的一个symbolic link。slocate 使用的是系统每日更新的数据库,所以若是在上次更新后又添加或者改动的文件它是无能为力的。

find 语法:find [path] [options] [expression]
find 最主要的工作就是生成一个文件或者目录名的列表。find 会沿着在[path]中指定的路径名递归向下查找知道所有符合条件的文件都被列出了。可以使用-name 选项限制列出的文件,在使用通配符时请务必加上双引号" "。
例如:find . -name index.html
find . -name "*.html"
find 的其他一些选项:
-atime +n, -n 列出多于/少于n天前被访问过的文件。
-mtime +n, -n 列出多于/少于n天前被修改过的文件。
-user uname 列出被uname 用户所拥有的文件
-group gname 列出被gname 组所拥有的文件
-perm mode 列出符合8进制的访问权限的文件
-size n[c] 列出占用n块,或者当有c 出现时,n个字符的文件。
-type c 列出c 类型的文件,c 可能是:b(block specail
file)、c(character special file)、d(directory)、
p(fifo or named pipe)、l(symbolic link)、
s(socket)、f(plain file)
-iname pattern 查找的pattern 大小写敏感。

find 的强大之处还在于它可以将找到的文件传给某些命令作为参数。语法:
find dir_list [options] -exec cmd {} \;
注意上面的语法,最后一个分号不要漏掉。
如果执行的命令cmd 需要确认,例如rm,则可用-ok 替代-exec。

Linux 提供了几套压缩文件工具。
# gzip, gunzip 是标准Linux 的压缩工具
# bzip2, bunzip2 是较新的Linux 压缩工具,一般比gzip
压缩比高一点,但是速度慢。bzip2压
缩的文件后缀名为.bz2。
# compress, uncompress 是以前UNIX 的压缩工具

gzip压缩的文件,一般后缀名为.gz,也可在许多非UNIX 平台上使用。另外gunzip 也可以解压用compress 压缩的文件。
用法:gzip [-d] file
gunzip file

其中gzip -d 的作用是解压,可以代替gunzip 命令。后跟的文件名不需打.gz 后缀。

最后要介绍的zip/unzip 是和DOS/Windows 平台下的pkzip/Winzip 相兼容的工具。它可以将多个文件压缩成一个文件,这是gzip 和compress 所作不到的。要在gzip 和compress 中压缩多个文件一般得要先组合成tar 文件,再行压缩。

tar命令源于tape archive 的简写,原本是用来将磁带机上的多个文件组合成一个文件用于传输或者长期保存整个文件系统(!)。虽然tar 不需要特殊的文件后缀,但通常需要在生成的文件后加.tar 后缀标识它是tar文件。

生成tar 文件:tar cvf archive_name source_files
其中source_files可以为多个文件,以空格分开;可以为通配符;也可以是一个目录,则目录下的文件和子目录都将打包进目标文件。

查询tar 文件:tar tf archive_name.tar 或者 tar tvf archive_name.tar
其中v 开关使得tar 生成文件的详细列表。

释放tar 文件:tar xvf archive_name.tar
将tar 文件的目录按照树形结构释放到当前目录。所以在执行前请cd 到目标目录,tar 不能指定目标目录。
tar 还有很多选项像保持原有的文件拥有者和保持原有的文件访问权限等,请查找man page。

压缩生成tar 文件:tar czf archive_name source_files
这里的archive_name 一般为tgz 为后缀。说明是tar 文件用gzip 压缩后的结果。就不用先打成tar 包,然后压缩成.tar.gz 文件了。

还原压缩的tar 文件并释放:tar xzf archive_name.tgz 这样释放回原有的所有文件到当前目录。
还原压缩的tar 文件:gzip -d archive_name.tgz 这样还原成.tar 文件到当前目录(不把tar 包释放)。

注:和Win32平台下不一样,gzip 解压缩后,源文件就不复存在了。例如gzip -d xzf myarchive.tgz 之后,原来的myarchive.tgz 就没有了,取而代之的是一个tar 文件。
还有gzip 压缩后源文件也不存在,变为加.gz 后缀的文件。但tar 打包后源文件依旧。

第七单元:bash shell
在bash shell 中按Ctrl+X 再按Ctrl+V 可获得当前bash 的版本号。echo $BASH_VERSION 也有同样的效果。

shell 脚本(shell scripts) 中的数据和环境设置都是存储在变量中,一般为大写字母。设定变量时,用一个等号来赋值如 FAV_COLOR = blue。而要取得一个变量值,可用$ 后跟环境变量名如 echo $FAV_COLOR。

区分shell 变量和环境变量:环境变量是一个比shell 变量“稍大”的概念。shell 变量只存在于当前shell 实例中,在subshell 中不继承原有的变量。而环境变量会传递给subshell。可以用export 命令将shell 变量输出到环境变量中。
$ EDITOR=/usr/bin/pico; export EDITOR
或者
$ export EDITOR=/usr/bin/pico
将EDITOR 变量置空(null)
$ export EDITOR=

一些通用环境变量:
# HOME 用户home 目录路径
# PATH 可执行文件搜索目录
# LANG 程序可用的语言设置,美国英语是en_US
# LINES 当前终端下可用的行数
# COLUMNS 当前终端下可用列数
# PS1 可用来设置命令行提示符
# EDITOR 定义程序默认调用的文本编辑器

例如:
$ mkdir $HOME/files
$ echo $PATH

PS1变量的组成:
\d 以“星期/月/日”排列的日期
\h 从第一个"."开始起的主机名
\H 完整主机名
\l shell 的终端设备名
\s shell 名
\t 当前24小时时间
\T 当前12小时时间
\@ 当前am/pm格式时间
\u 当前用户名
\w 当前工作目录
\W 当前工作目录的最后一层目录名
\! 该条指令的历史记录数
\\ 反斜杠

which 命令显示执行文件所在的目录,(沿PATH 变量所写的路径查找)例如
$ which xboard
/usr/local/bin/xboard

history 命令显示以前所输入的命令。
!! 重复上个命令
!x 重复上个由x开头的命令,后可跟追加的选项
!n 重复第n个命令(n可由history输出)
!-n 重复前n个命令

此外可使用^old^new 命令将上次的命令中的old 部分换为new,例如:
$ cp filter.c /usr/local/src/project
$ ^filter^frontend
cp frontend.c /usr/local/src/project
还有,你可以在命令行按CTRL-r 来实现从历史命令中查找所需的命令。
在历史命令查找中,输入的序号是history 输出的序号,或者按i 逆向查找。
如果你不想让历史命令中重复的命令和一些区别只在开头有无空格的命令时,你可以用
$ export HISTCONTROL=ignoreboth
来实现。

$的用处:在命令行替换一个变量值如:cd $HOME/public_html
{}的用处:表示{}内的所有组合如:rm hello.{c,o} 相当于 rm hello.c; rm hello.o
更多例子:
$ echo x{,b}
x xb
$ mkdir -p work/{inbox,outbox,pending}/{normal,urgent,import}
形成work 目录下3×3=9个子目录。

``和$()的用处:将''或者$()之内的内容当作命令执行。例如:
$ echo "Hostname: `hostname`"
$ echo "Hostname: $(hostname)"
其中hostname 是显示主机名的命令。注意`(数字1左边的按键)和'(单引号)的区别。

$[]的用处:将其中进行数字运算,然后输出。例如:
$ echo Area: $[$X*$Y]
$ echo Area: `expr $X * $Y` 这是老的sh 版本,必须用expr 命令计算。

[]的用处:将[]中的所有元素都取一遍输出。例如:
$ ls -a /dev/hd[a,b]
hda hdb

\的用处:将之后的一个字符作为“真正的字符”直接输出:
$ echo Your cost: \$5.00
还可以将一行命令分为两行输出(可看作是将回车当作了一般控制字符输出了):
$ ls -l |grep ^d | \
cut -cl7-25 |sort |less

''和""的用处:单引号''将其中所有的字符都看作“真正的字符”直接输出;双引号""将其中的所有字符除$ 、` 和\ 以外都看作“真正的字符”输出。比较:
$ echo "The current date is `date`"
The current date is Sat Apr 27 17:24:25 EDT 2002
$ echo 'The current date is `date`'
The current date is `date`

;的用处:类似程序语言中的分号,用于连接两个命令,依次执行。

()的用处:将两个用;连接的命令当作一个整体。例:
(date; who | wc -l) >> logfile
记录当前时间的登录人数,并敲上时间戳。

nohup 命令可以开始一个后台运行程序,即使你退出后它也继续执行。
$ nohup ar -cvf source.tar /opt/src &
$ exit
缺省状况下,nohup 的输出将会写到 nohup.out 中,如果当前目录不允许写,则写到$HOME/nohup.out,如若仍不成功,则命令不会执行。注意命令后面的&,因为nohup 不会自动将进程放到后台执行,所以需要显式的给出&,使其后台运行。或者按Ctrl-z使其后台运行。

命令返回值:返回0说明正确执行,返回其他数值说明有错误发生。可用$? 显示上条指令的返回值:echo $?
其中||(或)和&&(与)的操作可在shell script 中用来判断命令的返回值。和程序设计语言类似,若上条返回错误(假),则||执行下条,而&& 则跳过下条(与操作已为假)。若上条没有返回错误(真),则||不用执行下条(或操作已为真),而&& 执行下条命令。例如:
$ grep joe passwd || echo 'No joe!'
$ cp -a /tmp/*.o . && echo 'Done!'

aliase 使用户可以建立命令的“快捷方式”例如:alias dir='ls -laF | less'
若想查看所有的alias,直接打$ alias 即可。若想指定显示特定的alias,例$ aliase dir
注意如果你以root 登录,则rm 命令被alias 成rm -i,即每删除一个文件都将有个交互确认过程。如果你不想这样的话,可以使用unalias 命令。或者你可以使用\rm。
如果你想让某个用户在登录时就拥有某些aliase,则你应编辑它的$HOME/.bashrc 文件,在其中加入相应的aliase。如果你想让所有用户都拥有某些aliase,则编辑/etc/bashrc 文件,或者在/etc/profile.d/目录下的某个shell script 文件(由/etc/profile 启动脚本文件指定)中加入你所需要的alias 语句。

关于/etc/profile 文件,是整个系统的启动脚本文件,作用在所有用户上,设定函数、环境变量、路径和aliase 等等。当且仅当bash 是作为登录的shell 时,profile文件才会执行。

关于/etc/profile.d/目录,是/etc/profile 文件指定的目录,在profile 执行时,它检索/etc/profile.d/目录下的所有shell script,并执行之(理解错误之处还请指教!)。

其他的一些启动脚本,一个是~/.bash_profile,作用是为/etc/profile 添加一些定制的设定,只作用在当bash 是登录shell 时;另一个是~/.bashrc,所有的shell 都会使用它(有点不理解)。

关于.bash_logout,当用户从登录shell 中退出时,该script 执行一些诸如备份、删除临时文件的工作。

前面我们说到过<TAB>可以使用户避免输入冗长的命令,它会自动完成command completion。如果你在按<TAB>键时不想出现某些文件,可以在.bashrc 文件中加入
export FIGNORE='.bak'

如果你的命令比较长或者需要修改历史命令的话,那么命令行编辑就是必不可少的。
<CTRL-A> 移动到行头
<CTRL-E> 移动到行末
<CTRL-K> 将光标开始到行末的字符全部删除
<ESC> f 移动到下一个单词的开头
<ESC> b 移动到上一个或者当前单词的开头
这种编辑方法类似emacs 编辑器的风格。如果你想切换到vi 编辑器风格,可以键入:
set -o vi
如果你想使其成为默认风格,可以将上面的语句加在$HOME/.inputrc 中


shell 函数通常在shell script 中看到。但是你也可以在命令行中打入简单的函数。例如
lf () {
mount /mnt/floppy
ls -l /mnt/floppy
umount /mnt/floppy
}

fc 是bash 的一个内建命令,可用来查看、编辑并重新执行历史命令。
除了bash之外还有一些shell,如csh、tcsh 和ksh。

单元八:标准I/O与管道

Linux 提供进程3个I/O通道,标准输入缺省为键盘;标准输出缺省为终端屏幕;标准错误输出缺省为终端屏幕。它们均可被重定向。这里重定向和管道的区别在于:重定向为IO流定义一个新的目的地或者来源;而管道将IO流的输出转为另一个程序的输入。

一般重定向操作符:
> command > file 重定向标准输出到一个文件
>> command >> file 重定向标准输出添加到一个文件末尾
< command < file 命令从一个文件中接受输入(可用在类似tr 这种不支持文件名输入的场合)
2> command 2> file 重定向错误信息输出到一个文件
2>> command 2>> file 重定向错误信息输出添加到一个文件末尾
&> command &> file 将所有输出都定向到一个文件
&>> command &>> file 将所有输出都添加到一个文件
也可以这样写:command > alloutput 2>&1

关于管道和pipelines:UNIX 有两条基本定律,一是使用小程序来完成简单的一件事;二是所有的程序的输出可作为程序的输入。管道和pipelines 就是实现第二条的途径。
所有输出到标准输出的命令可以作为管道的左数;所有从标准输入输入的命令可作为管道的右数。
管道可以将多个命令串连,形成pipeline,一种UNIX 的强大机制。例如:
$ cut -f1 -d:passwd | sort -r | less
使用tee 命令可以使命令重定向到一个文件的同时重定向到另外一个程序。例如:
$ lspci -v | tee lspci.out | less

单元九:字符处理

head 和tail 命令缺省状态下显示文件的前10行。用-n 或者 --lines 参数来改变显示的行数。tail 命令中-f 选项非常有用,可以用来实时监控文件末尾的改动,特别是当查看日志文件时。

wc 命令统计文件中行数、字数和字符数。如果wc 后跟不止一个文件,则除了单个文件的统计,wc 还给出一个累计总数。

grep 命令在文本文件中搜索特定字符。例如 grep john /etc/passwd
-i 忽略大小写
-v 查找指定的项不在文件的行
-n 只在n行前查找
-c 只显示查找到行的总数
-l 只显示含有查找项的文件名
-r 递归查找,从当前目录开始
正则表达式在 grep 中的应用使得grep 成为最强大的搜索工具之一。以下是正则表达式规则:
. 表示与任一单个字母匹配
.* 表示与没有字母或者任意个字母匹配
[abc] 与字母a,b或c匹配
[^abc] 与除a,b,和c之外的字母匹配
a* 与a后面跟任意个a匹配
a? 与一个a相符或者没有任何字符
a+ 与单个a或者a后面重复任意个a相匹配
a\{n\} 与重复的n个a精确匹配
^ 在行首处匹配
$ 在行末处匹配
\ 后面跟的.或者其他正则表达式符号成为一般符号,例如\.
例如:
www\.redhat\.com 表示www.redhat.com
^^Yeps!$$ 整行是^Yeps!$

sort 命令将源文件排序,然后输出到stdout。
-r 降序排序(默认是升序)
-n 数字排序
-f 忽略大小写
-u 去除相同行
+m 从第m列开始,一直到行末,作为排序的键
+m -n 从第m列开始作为排序的键,但不包括第n列

uniq 命令将文件中相邻的重复的行删除。可以同sort -u 一起使用以消除所有的重复行。
-u 输出只出现过一次的行
-d 输出只出现过两次的行
-c 输出加上出现频率次数
-fn/-sn 避免比较第n列后的输出

cut 命令显示文件内容定制的列。
-f 设置显示第n列
-d 设置分界符(缺省是TAB)
-c 将第n到第m个字符中间的列输出,如 -c2-5

paste 命令将多个文件“垂直”合并为一个,然后从标准输出上输出。
-d 设置分界符,缺省为TAB键
例如:
$ cat fileA
1
2
3
$ cat fileB
a
b
c
$ paste fileA fileB
1 a
2 b
3 c

diff 比较两个文件,输出相异之处。< 代表第一个文件,> 代表第二个文件。
$ diff fileA fileB
33c33
< x = y + 2;
---
> x = y + 4;

tr 命令将输入中的字符替换或者删除。它不能直接接受文件名,而需要通过重定向接受文件内容。
-d tr 用于删除后跟的字符如tr -d "\n" < area.c > new.area.c
其中,\后跟的数字如"\012" 表示相应的ASCII 字符。
又如:tr [A-Z] [a-z] < text1.txt > text2.txt 将所有的大写字母替换成小写字母。

aspell 命令用作拼写检查,aspell check filename,这是一个简单的菜单驱动的拼写工具。aspell -i 可以作为非互动的错字输出。

look 命令可以用作简单的拼写字典,当你需要拼写帮助的时候用它。

expand 命令将输入中的tab键转换为空格。
fmt 命令将输入中的字符格式化成段落,以-wn 控制每行字符数,-u 在每行末尾加上两个空格。
pr 命令将输入中的字符格式化成可输出的格式。

 楼主| 发表于 2003-3-5 17:48:41 | 显示全部楼层
 楼主| 发表于 2003-3-5 17:51:20 | 显示全部楼层
发表于 2003-3-5 22:56:04 | 显示全部楼层
顶一下 , 明天再看

:p
 楼主| 发表于 2003-3-7 15:39:06 | 显示全部楼层
无法修改帖子嘛,说要1440分钟以后再改。我已经等了一天了,请斑竹帮一下忙!
发表于 2003-3-7 21:36:27 | 显示全部楼层
非常感谢顶楼的feng_ye兄弟:)
嗯,打印下来好好研究研究...
 楼主| 发表于 2003-3-7 21:43:49 | 显示全部楼层
先别忙,兄弟,我还要改的啊
发表于 2003-3-10 13:18:48 | 显示全部楼层
feng_ye兄弟,你也是eloo上课的吗?
3月3日开的班??
 楼主| 发表于 2003-3-10 17:50:15 | 显示全部楼层
楼上的兄弟,我是春节前开班的那个周末班学员。因为时间关系笔记滞后很多
发表于 2003-3-10 23:08:16 | 显示全部楼层
精品,兄台辛苦了!!!

兄弟把改正的帖在本帖的后面,由probing兄来操作,如果他不在,我也可以操作修改。

多谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表