免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1341 | 回复: 0
打印 上一主题 下一主题

linux与unix shell编程指南(学习笔记) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-03-03 12:25 |只看该作者 |倒序浏览


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之间

7.1使用句点匹配单字符
句点“.”可以匹配任意单字符
前4个字符任意,5,6字符为XC,后4个字符也任意,按下例运行:
1234XC4545–match
1234XA4545-nomatch
1235XC4545-match
1234XB4545-nomatch
注意,“.”允许匹配ASCII集中任意字符,或为字母,或为数字。
7.2在行首以^匹配字符串或字符序列
^只允许在一行的开始匹配字符或单词
7.3在行尾以$匹配字符串或字符
可以说$与^正相反,它在行尾匹配字符串或字符,$符号放在匹配单词后。假定要匹配以
单词trouble结尾的所有行,操作为:
trouble$
类似的,使用1d$返回每行以1d结尾的所有字符串。
7.4使用*匹配字符串中的单字符或其重复序列
使用此特殊字符匹配任意字符或字符串的重复多次表达式。例如:
compu*t
将匹配字符u一次或多次:
computer
compuuting
compuuuttte
7.5使用\屏蔽一个特殊字符的含义
有时需要查找一些字符或字符串,而它们包含了系统指定为特殊字符的一个字符。
特殊字符:$.‘“[]^|0\|?
CASE:
\.
上述模式不认为反斜杠后面的字符是特殊字符,而是一个普通字符,即句点。
\^
匹配包含^的各行,将反斜杠放在它前面就可以屏蔽其特殊含义。
\*\.pas
在正则表达式中匹配以*.pas结尾的所有文件,可做如下操作:
7.6使用[]匹配一个范围或集合
使用[]匹配特定字符串或字符串集,可以用逗号将括弧内要匹配的不同字符串分开
使用“-”表示一个字符串范围,表明字符串范围从“-”左边字符开始,到“-”右边字
符结束。
如要匹配任意字母或数字,模式如下:
[A-Za-z0-9]

要匹配任意字母,则使用:
[A-Za-z]
表明从A-Z、a-z的字母范围。

假定要匹配任意一个数字,可以使用:
[0123456789]
然而,通过使用“-”符号可以简化操作:
[0-9]
或任意小写字母
[a-z]

注意^符号的使用,当直接用在第一个括号里,意指否定或不匹配括号里内容。
[^a-zA-Z]
匹配任一非字母型字符,而
[^0-9]

7.7使用\{\}匹配模式结果出现的次数
使用*可匹配所有匹配结果任意次,但如果只要指定次数,就应使用\{\},此模式有三种
形式,即:
pattern\{n\}匹配模式出现n次。
pattern\{n,\}匹配模式出现最少n次。
pattern\{n,m}匹配模式出现n到m次之间,n,m为0-255中任意整数。
A\{2\}B
匹配值为AAB

表7-2经常使用的正则表达式举例
^对行首
$对行尾
^[the]对以the开头行
[Ss]igna[lL]对匹配单词signal、signaL、Signal、SignaL
[Ss]igna[lL]\.对同上,但加一句点
[mayMAY]对包含may大写或小写字母的

^USER$对只包含USER的行
[tty]$对以tty结尾的行
\.对带句点的行
^d..x..x..x对对用户、用户组及其他用户
组成员有可执行权限的目录
^[^l]对排除关联目录的目录列表
[.*0]对0之前或之后加任意字符
[000*]对000或更多个
[iI]对大写或小写I
[iI][nN]对大写或小写i或n
[^$]对空行
[^.*$]对匹配行中任意字符串
^......$对包括6个字符的行
[a-zA-Z]对任意单字符
[a-z][a-z]*对至少一个小写字母
[^0-9\$]对非数字或美元标识
[^0-0A-Za-z]对非数字或字母
[123]对1到3中一个数字
[Dd]evice对单词device或Device
De..ce对前两个字母为De,后跟两个
任意字符,最后为ce
\^q对以^q开始行
^.$对仅有一个字符的行
^\.[0-9][0-9]对以一个句点和两个数字开始
的行
'"Device"'对单词device
De[Vv]ice\.对单词Device或device
[0-9]\{2\}-[0-9]\{2\}-[0-9]\{4\}对日期格式dd-mm-yyyy
[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}\.[0-9]\{3\}对IP地址格式nnn.nnn.nnn.nnn
[^.*$]对匹配任意行
^[^l]对排除关联目录的目录列表
[.*0]对0之前或之后加任意字符
[000*]对000或更多个
[iI]对大写或小写I
[iI][nN]对大写或小写i或n
[^$]对空行
[^.*$]对匹配行中任意字符串
^......$对包括6个字符的行
[a-zA-Z]对任意单字符
[a-z][a-z]*对至少一个小写字母
[^0-9\$]对非数字或美元标识
[^0-0A-Za-z]对非数字或字母
[123]对1到3中一个数字
[Dd]evice对单词device或Device
De..ce对前两个字母为De,后跟两个
任意字符,最后为ce
第8章grep 家族
grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式, grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集

8.1 grep
g r e p一般格式为:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串。

8.1.1 双引号引用
在g r e p命令中输入字符串参数时,最好将其用双引号括起来。例如:“m y s t r i n g”。这样做有两个原因,一是以防被误解为s h e l l命令,二是可以用来查找多个单词组成的字符串.
8.1.2 grep选项
常用的g r e p选项有:
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
8.1.3 查询多个文件
如果要在当前目录下所有. d o c文件中查找字符串“ s o r t”,方法如下:
$ grep "sort"*.doc
8.1.4 行匹配
$ grep -c "48"data.f
$ 4
g r e p返回数字4,意义是有4行包含字符串“4 8”。
8.1.5 行数
显示满足匹配模式的所有行行数
[oracle@YJDKHDB oracle]$ grep -n "48" data.f
1:48    dec     3bc1997 LPSX    68.00   LVX2A   138
2:483   SEPT    5AP1996 USP     65.00   LVX2A   189
8.1.6 显示非匹配行
显示所有不包含4 8的各行:
[oracle@YJDKHDB oracle]$ grep -v "48" data.f
47      OCT     3ZL1887 LPSX    43.00   KVM9D   512
219     MAY     5PA1998 USP     37      KVM9K   644
216     SEPT    3Z11998 USP     86.00   KVM9E   234
8.1.7 精确匹配
使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加\ >。假定现在精确抽取47
[oracle@YJDKHDB oracle]$ grep "47\>" data.f
47      OCT     3ZL1887 LPSX    43.00   KVM9D   512
8.1.8 大小写敏感
缺省情况下, g r e p是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关
[oracle@YJDKHDB oracle]$ grep -i "sept" data.f
483     SEPT    5AP1996 USP     65.00   LVX2A   189
216     SEPT    3Z11998 USP     86.00   KVM9E   234

8.2 grep和正则表达式
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用
正则表达式时最好用单引号括起来,这样可以防止g r e p中使用的专有模式与一些s h e l l命令的
特殊方式相混淆。
8.2.1 模式范围
假定要抽取代码不为4 7 4和4 7 8的城市位置,
[oracle@YJDKHDB oracle]$ grep '47[^48]' data.f
47      OCT     3ZL1887 LPSX    43.00   KVM9D   512
8.2.2 不匹配行首
如果要抽出记录,使其行首不是4 8,可以在方括号中使用^记号,表明查询在行首开始。
[oracle@YJDKHDB oracle]$ grep '^[^48]' data.f
219     MAY     5PA1998 USP     37      KVM9K   644
216     SEPT    3Z11998 USP     86.00   KVM9E   234
8.2.3 设置大小写
使用- i开关可以屏蔽月份S e p t的大小写敏感,也可以用另一种方式。这里使用[ ]模式抽取
各行包含S e p t和s e p t的所有信息。
[oracle@YJDKHDB oracle]$ grep "[Ss]EPT" data.f
483     SEPT    5AP1996 USP     65.00   LVX2A   189
216     sEPT    3Z11998 USP     86.00   KVM9E   234
如果要抽取包含S e p t的所有月份,不管其大小写,并且此行包含字符串4 8 3,可以使用管
道命令,即符号“|”左边命令的输出作为“ |”右边命令的输入
[oracle@YJDKHDB oracle]$ grep "[Ss]EPT" data.f | grep 189
483     SEPT    5AP1996 USP     65.00   LVX2A   189
8.2.4 匹配任意字符
如果抽取以L开头,以A结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
[oracle@YJDKHDB oracle]$ grep "L...A" data.f
48      dec     3bc1997 LPSX    68.00   LVX2A   138
483     SEPT    5AP1996 USP     65.00   LVX2A   189
8.2.5 日期查询
一个常用的查询模式是日期查询。先查询所有以5开始以1 9 9 6或1 9 9 8结尾的所有记录。使
用模式5 . . 1 9 9 [ 6 , 8 ]。
[oracle@YJDKHDB oracle]$ grep "3..199[68]" data.f
216     sEPT    3Z11998 USP     86.00   KVM9E   234
8.2.6 范围组合
必须学会使用[ ]抽取信息. 第一个字符为任意字符,第二个字符在0到5之间,第三个字符在0到6之间
[oracle@YJDKHDB oracle]$ grep ".[0-5][0-6]" data.f
48      dec     3bc1997 LPSX    68.00   LVX2A   138
483     SEPT    5AP1996 USP     65.00   LVX2A   189
47      OCT     3ZL1887 LPSX    43.00   KVM9D   512
219     MAY     5PA1998 USP     37      KVM9K   644
216     sEPT    3Z11998 USP     86.00   KVM9E   234
8.2.7 模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法如下:
[oracle@YJDKHDB oracle]$ grep '4\{2,\}' data.f
219     MAY     5PA1998 USP     37      KVM9K   644
8.2.8 使用grep匹配“与”或者“或”模式
g r e p命令加- E参数
[oracle@YJDKHDB oracle]$ grep -E '183|219' data.f
219     MAY     5PA1998 USP     37      KVM9K   64
8.2.9 空行
结合使用^和$可查询空行。使用- n参数显示实际行数:
[oracle@YJDKHDB oracle]$ grep –n '^$' data.f
8.2.10 匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。
8.3 类名
g r e p允许使用国际字符模式匹配或匹配模式的类名形式。
8.4 系统grep命令
使用已学过的知识可以很容易通过g r e p命令获得系统信息。通过管道方式
8.4.1 目录
如果要查询目录列表中的目录,方法如下:
$ ls –l | grep ‘^d’
8.4.2 passwd文件
使用g r e p命令- s开关,可屏蔽错误信息
[oracle@YJDKHDB oracle]$ grep 'fdskfds' ata.f
grep: ata.f: No such file or directory
[oracle@YJDKHDB oracle]$ grep -s 'fdskfds' ata.f

或者  grep “fdskfds“ ata.f >/dev/null  2>&1
8.4.4 对一个字符串使用grep
$str=”mary joe peter pauline”
$echo $str | grep “mary”
8.5 egrep
e g r e p代表e x p r e s s i o n或extended grep,适情况而定。e g r e p接受所有的正则表达式, e g r e p
的一个显著特性是可以以一个文件作为保存的字符串. 使用- f开关
$pg grepstrings
484
47
$grep –f grepstrings data.f




本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u/479/showart_80527.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP