Author:流川
Title:linux与unix shell编程指南(学习笔记)
E-Mail: :xsp_cn@yahoo.com.cn
第1章文件安全与权限
一个文件一经创建,就具有三种访问方式:
1) 读,可以显示该文件的内容。
2) 写,可以编辑或删除它。
3) 执行,如果该文件是一个s h e l l脚本或程序。
按照所针对的用户,文件的权限可分为三类:
1) 文件属主,创建该文件的用户。
2) 同组用户,拥有该文件的用户组中的任何用户。
3) 其他用户,即不属于拥有该文件的用户组的某一用户。
1 文件类型
d 目录。
l 符号链接(指向另一个文件)。
s 套接字文件。
b 块设备文件。
c 字符设备文件。
p 命名管道文件。
- 普通文件,或者更准确地说,不属于以上几种类型的文件。
2.符号模式
c h m o d命令的一般格式为: chmod [who] operator [permission] filename
3.绝对模式
c h m o d命令绝对模式的一般形式为: chmod [mode] file
其中m o d e是一个八进制数。
4.chown和chgrp
当你创建一个文件时,你就是该文件的属主。一旦你拥有某个文件,就可以改变它的所有权
ch o w n命令的一般形式为:chmod -R -h owner file
- R选项意味着对所有子目录下的文件也都进行同样的操作。- h选项意味着在改变符号链
接文件的属主时不影响该链接所指向的目标文件。
Chgrp命令与chown大体相同
5.当最初登录到系统中时, u m a s k命令确定了你创建文件的缺省模式。这一命令实际上和
c h m o d命令正好相反。
u m a s k命令是在/ e t c / p r o f i l e文件中设置的,每个用户在登录时都会引用这个文件
查看umask :[root@YJDKHDB oracle]# umask output:0022
,这一数字的最大值分别是6。系统不允许你在创建一个文本文件时就赋予它执行权限,必须在创建后用c h m o d命令增加这一权限. 针对目录来说, u m a s k中各个数字最大可以到7
u m a s k值002 所对应的文件和目录创建缺省权限分别为6 6 4和7 7 5
5.符号链接
该命令的一般形式为: ln [-s] source_path target_path 相当于windows中的快捷方式
第2章使用find和xargs
1.F i n d命令的一般形式为: find pathname -options [-print -exec -ok]
pathname find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print find命令将匹配的文件输出到标准输出。
-exec find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为'command' {} \;,注意{ }和\;之间的空格。
-ok 和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,
在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find命令选项
-name 按照文件名查找文件。
-perm 按照文件权限来查找文件。
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用了- depth选项,那么- prune选项将被find命令忽略。
-user 按照文件属主来查找文件。
-group 按照文件所属的组来查找文件。
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以
-nogroup 查找无有效所属组的文件,即该文件所属的组在/ e t c / g r o u p s中不存在。
-nouser 查找无有效属主的文件,即该文件的属主在/ e t c / p a s s w d中不存在。
-newer file1 ! file2 查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。
-type 查找某一类型的文件,诸如:
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
-depth 在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
-fstype 查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件
/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。
-mount 在查找文件时不跨越文件系统mount点。
-follow 如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio 对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。
可以使用文件名模式来匹配文件,记住要用引号将文件名模式引起来.
使用~作为' p a t h n a m e参数,波浪号~代表了你的$ H O M E目录。 $ find ~ -name "*.txt" -print
想要在当前目录及子目录中查找所有的‘ * . t x t’文件,可以用: $ find . -name "*.txt" -print
想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用: $ find . -name "[A-Z]*" –print
使用perm选项 $ find . -perm 755 -print
忽略某个目录 $ find /apps -name "/apps/bin" -prune -o -print
使用user和nouser选项 $ find ~ -user dave -print
使用group和nogroup选项 find /apps -group accts -print
按照更改时间查找文件 $ find / -mtime -5 -print
使用type选项 $ find /etc -type d -print
使用size选项
为了在/ h o m e / a p a c h e目录下查找文件长度恰好为1 0 0字节的文件,可以用: $find /home/apache -size 100c -print
为了在当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节),可以用: $ find . -size +10 -print
使用depth选项 望先匹配所有的文件,再在子目录中查找 $ find / -name "CON.FILE" -depth -print
使用mount选项
在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。 $ find . -name "*.XC" -mount -print
使用cpio选项
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。
使用exec或ok来执行shell命令
e x e c选项后面跟随着所要执行的命令,然后是一对儿{ },一个空格和一个\,最后是一个
分号。
在/ l o g s目录中查找更改时间在5日以前的文件并删除它们,可以用: $ find logs -type f -mtime +5 -exec rm {} \;
f i n d命令在当前目录中查找所有文件名以. L O G结尾、
更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示 $ find / -name “*.log” -mtime +5 –ok rm{} \;
查找文件名为”passwd*”文件中是否存在”rounder”用户: $ find / -name “passwd*” –exec grep “rounder” {} \; CASE:
查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用: $ find / -type f -size 0 -exec ls -l {} \;
为了查找/ v a r / l o g s目录中更改时间在7日以前的普通文件,并删除它们,可以用: $ find /var/logs -type f -mtime +7 -exec rm {} \;
为了查找当前文件系统中的所有目录并排序,可以用: $ find . -type d -print -local -mount |sort
为了查找系统中所有的r m t磁带设备,可以用: $ find /dev/rmt -print
2 xargs
在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递
给e x e c执行.有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行
几分钟之后,就会出现溢出错误。
在/ a p p s / a u d i t目录下查找所有用户具有读、写和执行权限的文件,并收回相应
的写权限: $ find /apps/audit -perm -7 -print | xargs chmod o-w
用g r e p命令在所有的普通文件中搜索d e v i c e这个词: $ find / -type f -print | xargs grep "device"
用g r e p命令在当前目录下的所有普通文件中搜索D B O这个词:
$ find . -name *\-type f -print | xargs grep "DBO"
第3章后台执行命令
后台运行有几种方法: 1) crontab 2) at 3)后台命令(分号结束) 4) nohup命令
2.crontab文件的域,分为六列,crontab命令从左边开始读起
分钟 小时 日期 月份 星期 程序
1)连续时间可以用 * ,其它如 1-4(星期一 – 星期四) ,1,4 星期一、星期四
2)程序要给出绝对路,crontab并不一定识得环境变量
3)crontab 命令的一般格式为:crontab [-u user] –e –l – r
其中:
-u 用户名.
-e 编辑crontab 文件中的内容
-l 列出 crontab 文件中的内容
-r 删除crontab 文件
用户自己登录就不用使用-u选项
4)可以自定义一个crontab文件,然后由crontab命令提交。如crontab xspcron
5)恢复crontab文件,①将cron文件拷贝到/var/spool/cron目录下,或者 crontab filename
3.at 命令
a t命令的基本形式为:at [-f script] [-m -l -r] [time] [date]
其中,
-f script 是所要提交的脚本或命令。
-l 列出当前所有等待运行的作业。a t q命令具有相同的作用。
-r 清除作业。为了清除某个作业,还要提供相应的作业标识( I D);有些U N I X变体只
接受a t r m作为清除命令。
-m 作业完成后给用户发邮件。
time at命令的时间格式非常灵活;可以是H、H H . H H M M、H H : M M或H : M,其中H和M
分别是小时和分钟。还可以使用a . m .或p . m .。
date 日期格式可以是月份数或日期数
清除一个作业
清除作业的命令格式为: atrm [job no]或 at -r [job no] 4. &命令 (1)command >out.file 2>&1 &
在上面的例子中,所有的标准输出和错误输出都将被重定向到一个叫做out.file 的文件中
(2)查询后台进程
ps –aux | grep 进程号
5.nohup命令 就是不挂起的意思( n o hang up)。
该命令可以在你退出帐户之后继续运行相应的进程
该命令的一般形式为:nohup command &
在缺省情况下该作业的所有输出都被重定向到一个名为n o h u p . o u t的文件中,除非另外指定了输出文件:nohup command > myout.file 2>&1
如果希望一次提交几个命令,最好能够把它们写入到一个s h e l l脚本文件中,并用n o h u p命令来执行它.
第4章文件名置换
S h e l l提供了一套完整的
字符串模式匹配规则,或者称之为元字符,
特殊字符:
* 匹配文件名中的任何字符串,包括空字符串。
? 匹配文件名中的任何单个字符。
[...] 匹配[ ]中所包含的任何字符。
[!...] 匹配[ ]中非感叹号!之后的字符。
当s h e l l遇到上述字符时,就会把它们当作特殊字符,而不是文件名中的普通字符,这样
用户就可以用它们来匹配相应的文件名。
4.1 使用*
$ ls –l *.doc
4.2 使用?
$ ls –l ??d.*
4.3 使用[...]和[!...]
使用[ . . . ]可以用来匹配方括号[ ]中的任何字符。在这一方法中,还可以使用一个横杠-来连
接两个字母或数字,以此来表示一个范围。
寻找以log.开头,后面跟随一个数字的任意文件名
$ ls log.[0-9]*
使用[ ! 0 - 9 ] *来表示非数字开头的字符串,其中!是非的意思:
$ ls log.[!0-9]*
列出所有以大写字母开头的文件名,可以用: $ ls [A-Z]*
为了列出所有以小写字母开头的文件名,可以用: $ ls [a-z]*
为了列出所有以数
第5章shell输入与输出
在s h e l l脚本中,可以用几种不同的方式读入数据:可以使用标准输入—缺省为键盘,或
者指定一个文件作为输入. 如果不指定某个文件作为输出,标准输出总是和终端屏幕相关联。
5.1 echo
使用e c h o命令可以显示文本行或变量,或者把字符串输入到文件。它的一般形式为: echo string
e c h o命令有很多功能,其中最常用的是下面几个:
\c 不换行。
\f 进纸。
\t 跳格。
\n 换行。
\e 输入出转义字符
如果希望提示符出现在输出的字符串之后,可以用:
$echo “what is your name:\c”
必须使用-e选项才能使转义符生效:
$echo “what is\tyour\tname”;
如果想把一个字符串输出到文件中,使用重定向符号>。在下面的例子中一个字符串被重
定向到一个名为m y f i l e的文件中: $ echo "The log files have all been done"> myfile
或者可以追加到一个文件的末尾,这意味着不覆盖原有的内容: $ echo "$LOGNAME carried them out at `date`">>myfile
输出双引号:
echo "\"what is your"\"
5.2 read
可以使用r e a d语句从键盘或文件的某一行文本中读入信息,并将其赋给一个变量。
它的一般形式为: read varible1 varible2
这时读入我们输入的变量,变量以空格做为分隔
5.3 cat
c a t是一个简单而通用的命令,可以用它来显示文件内容,创建文件,还可以用它来显示
控制字符。
c a t命令的一般形式为: cat [options] filename1 ... filename2 ...
-v 显示控制字符
-n 显示行号
如果希望创建一个新文件,并向其中输入一些内容,只需使用c a t命令把标准输出重定向
到该文件 $ cat > myfile 把cat的标准输入重定向到myfile文件,相当于一个编辑器,结ctrl+d结束
5.4 管道
可以通过管道把一个命令的输出传递给另一个命令作为输入。管道用竖杠|表示。它的一
般形式为:
命令1 |命令2
其中|是管道符号。
此管
道的含义正如它的名字所暗示的那样:把信息从一端传送到另外一端
5.5 tee
e e命令作用可以用字母T来形象地表示。它把输出的一个副本输送到标准输出,另一个
副本拷贝到相应的文件中。
它的一般形式为: tee -a files
其中,- a表示追加到文件末尾。
$who | tee who.out
我们使用w h o命令,结果输出到屏幕上,同时保存在who.out文件
5.6 标准输入、输出和错误
当我们在s h e l l中执行命令的时候,每个进程都和三个打开的文件相联系,并使用文件描
述符来引用这些文件
文件描述符及它们通常所对应的文件名:
文件文件描述符
输入文件—标准输入0
输出文件—标准输出1
错误输出文件—标准错误2
系统中实际上有1 2个文件描述符,但是正如我们在上表中所看到的, 0、1、2是标准输入、
输出和错误。可以任意使用文件描述符3到9。
5.6.1 标准输入
标准输入是文件描述符0。它是命令的输入,缺省是键盘,也可以是文件或其他命令的输出。
5.6.2 标准输出
标准输出是文件描述符1。它是命令的输出,缺省是屏幕,也可以是文件。
5.6.3 标准错误
标准错误是文件描述符2。这是命令错误的输出,缺省是屏幕,同样也可以是文件
5.7 文件重定向
command > filename 把把标准输出重定向到一个新文件中
command >> filename 把把标准输出重定向到一个文件中(追加)
command 1 > fielname 把把标准输出重定向到一个文件中
command > filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中
command 2 > filename 把把标准错误重定向到一个文件中
command 2 >> filename 把把标准输出重定向到一个文件中(追加)
command >> filename 2>&1 把把标准输出和标准错误一起重定向到一个文件中(追加)
command filename2 把c o m m a n d命令以f i l e n a m e文件作为标准输入,以f i l e n a m e 2文件
作为标准输出
command 把c o m m a n d命令以f i l e n a m e文件作为标准输入
command 把从标准输入中读入,直至遇到d e l i m i t e r分界符
command 把把文件描述符m作为标准输入
command >&m 把把标准输出重定向到文件描述符m中
command 把关闭标准输入
5.7.1 重定向标准输出
输出都被重定向到l s . o u t文件中: $ ls >ls.out
如果希望追加到已有的文件中(在该文件不存在的情况下创建该文件),那么可以使用
$ pwd >>pwd.out
如果想创建一个长度为0的空文件,可以用' > f i l e n a m e ': $ >myfile
5.7.2 重定向标准输入
可以指定命令的标准输入 $ sort
s o r t命令的输入是采用重定向的方式给出的. $ sort name.out
更进一步地通过重定向为s o r t命令指定一个输出文件n a m e . o u t
重定向操作符command 是一种非常有用的命令. 。s h e l l将分界符d e l i m i t e r之
后直至下一个同样的分界符之前的所有内容都作为输入,遇到下一个分界符, s h e l l就知道输
入结束了。
$cat >> my.txt
>hello
>my name is
>mayday ##识别结束
5.7.3 重定向标准错误
为了重定向标准错误,可以指定文件描述符2。
[oracle@YJDKHDB oracle]$ grep "trident" missiles
grep: missiles: No such file or directory
g r e p命令没有找到该文件,缺省地向终端输出了一个错误信息。现在让我们把错误重定向到文件/ d e v / n u l l中(实际就上是系统的垃圾箱): $ grep "trident" missiles 2>/dev/null
这样所有的错误输出都输送到了/ d e v / n u l l,不再出现在屏幕上 $ grep "trident" missiles 2>grep.err 将标准错误重定向到 grep.err文件中
5.8 结合使用标准输出和标准错误 $ cat account_qtr.doc account_end.doc 1>accounts.out 2>accounts.err
两个文件合并到a c c o u n t s . o u t文件中, 如果出现了错误,相应的错误将会保存在a c c o u n t s . e r r文件中。
5.9 合并标准输出和标准错误
在合并标准输出和标准错误的时候,切记s h e l l是从左至右分析相应的命令的。 cleanup >cleanup.out 2>&1
在上面的例子中,我们将c l e a n u p脚本的输出重定向到c l e a n u p . o u t文件中,而且其错误也
被重定向到相同的文件中。
5.10 exec
e x e c命令可以用来替代当前s h e l l;换句话说,并没有启动子s h e l l。使用这一命令时任何现
有环境都将会被清除,并重新启动一个s h e l l。它的一般形式为: exec command
其中的c o m m a n d通常是一个s h e l l脚本。
第6章命令执行顺序
在成功地执行一个命令之后再执行另一个命令,或者在一个命令失败后再执行
另一个命令,& &和| |可以完成这样的功能。相应的命令可以是系统命令或s h e l l脚本。
S h e l l还提供了在当前s h e l l或子s h e l l中执行一组命令的方法,即使用()和{ }。
6.1 使用&&
使用& &的一般形式为:
命令1 && 命令2
这种命令执行方式相当地直接。& &左边的命令(命令1)返回真(即返回0,成功被执行)
后,& &右边的命令(命令2)才能够被执行;换句话说,“如果这个命令执行成功& &那么执
行这个命令”。
CASE:
$CP a.doc b.doc && echo “if you are seeing this then cp was ok”
更为实用的例子: $ mv /apps/bin /apps/dev/bin && rm -r /apps/bin
在上面的例子中,/ a p p s / b i n目录将会被移到/ a p p s / d e v / b i n目录下,如果它没有被成功执行,
就不会删除/ a p p s / b i n目录。
6.2 使用||
使用| |的一般形式为:
命令1 || 命令2
| |的作用有一些不同。如果| |左边的命令(命令1)未执行成功,那么就执行| |右边的命令
(命令2);或者换句话说,“如果这个命令执行失败了|| 那么就执行这个命令
6.3 用()和{ }将命令结合在一起
如果希望把几个命令合在一起执行, s h e l l提供了两种方法。既可以在当前s h e l l也可以在
子s h e l l中执行一组命令。
它的一般形式为: (命令1;命令2;. . .)
如果使用{ }来代替(),那么相应的命令将在子s h e l l而不是当前s h e l l中作为一个整体被执
行,只有在{ }中所有命令的输出作为一个整体被重定向时,其中的命令才被放到子s h e l l中执
行,否则在当前s h e l l执行。它的一般形式为: {命令1;命令2;. . . }
第7章正则表达式介绍
本章内容包括:
•匹配行首与行尾。
•匹配数据集。
•只匹配字母和数字。
•匹配一定范围内的字符串集。
当从一个文件或命令输出中抽取或过滤文本时,可以使用正则表达式(RE),正则表达式
是一些特殊或不很特殊的字符串模式的集合。
基本元字符使用在grep和sed命令中,同时结合{\\}(以字符出现情况进行匹配
的元字符)使用在awk语言中。
表7-1基本元字符集及其含义
^只只匹配行首
$只只匹配行尾
*只一个单字符后紧跟*,匹配0个或多个此单字符
[]只匹配[]内字符。可以是一个单字符,也可以是字符序列。可以使用-表示[]内字符序列范围,如用[1-5]代替[12345]
\只用来屏蔽一个元字符的特殊含义。因为有时在shell中一些元字符有特殊含义。\可以使其失去应有意义
.只匹配任意单字符
pattern\{n\}只用来匹配前面pattern出现次数。n为次数
pattern\{n,\}m只含义同上,但次数最少为n
pattern\{n,m\}只含义同上,但pattern出现次数在n与m之间