Chinaunix首页 | 论坛 | 博客
  • 博客访问: 539942
  • 博文数量: 128
  • 博客积分: 4000
  • 博客等级: 上校
  • 技术积分: 1345
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-22 21:43
文章分类

全部博文(128)

文章存档

2009年(30)

2008年(98)

我的朋友

分类: LINUX

2008-04-23 13:15:19

1.grep格式:
grep [选项]基本正则表达式[文件]
这里基本正则表达式可为字符串

grep命令中输入字符串参数时,最好将其用双引号括起来。一是以防被误解为s h e l l命令,二是可以用来查找多个单词组成的字符串。
在调用变量时,也应该使用双引号,如: grep "$MYVAR"文件名
在调用模式匹配时,应使用单引号。

2.grep选项
-c 只输出匹配行的计数。
-i 不区分大小写(只适用于单字符)。
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件名。
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。

3.查询多个文件
eg: 如在当前目录下所有.doc文件中查找字符串"sort"
$ grep "sort" *.doc
在所有文件中查询单词"sort it"
$ grep "sort it" *
在当前目录下的所有文件中查询有"awk"字符串的文件,并且只显示文件名
$ grep -l "awk" *
在当前目录下所有文件中查询有"awk"字符串的文件,显示文件名和所处行号
$ grep -n "awk" *
duawk.awk:1:#!/bin/awk -f
duawk.awk:2:# to call: du | duawk.awk

文件文件中grep选项的用法:
行匹配:
$ grep -c "48" data.f
$ 4
grep 反回数字4,意思是有4行包含字符串"48"
现在显示包含"48"字符串的4行文件
$ grep "48" data.f

行数:
$ grep -n "48" data.f

显示非匹配行
$ grep -v "48" data.f

精确匹配
$ grep "48" data.f
用grep抽取精确匹配的一种更有效的方式是在抽取字符串后加\>

大小写敏感
缺省情况下,grep是大小写敏感的,如果查询大小写不敏感字符串,必须使用-i开关
$ grep -i "sept" data.f
483     Sept    5AP1996 USP     65.00   LVX2C   189

grep和正则表达式
使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。
1.模式范围
假定要抽取代码为484和483的城市位置
$ grep '48[34]' data.f

2.不匹配行首
抽出记录,使行首不是48,可以在方括号中使用^记号,表明查询在行首开始
$ grep '^[^48]' data.f

3.设置大小写
$ grep '[Ss]ept' data.f
如果要抽取包含Sept的所有月份,不管其大小写,并且此行包含字符串483,可以使用管道
$ grep '[Ss]ept' data.f | grep 483

4.匹配任意字符
抽取以L开头,以D结尾的所有代码,长度为5个字符
$ grep 'K...D' data.f
前两个是大写字母,中间任意,以C结尾
$ grep '[A-Z][A-Z]..C' data.f

5.日期查询
$ grep '5..199[6,8]' data.f
查询包含1998的所有记录的另外一种方法是使用表达式[0-9]\{3\}[8]
意思是:任意数字重复3次,后跟数字8
$ grep '[0-9]\{3\}[8]' data.f

6.范围组合
$ grep '[0-9][0-5][0-6]' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
以行首开始,使用^符号
$ grep '^[0-9][0-7]' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
219     dec     2CC1999 CAD     23.00   PLV2C   68

7.模式出现机率
抽取包含数字4至少重复出现两次的所有行,方法:
$ grep '4\{2,\}' data.f
抽取记录使之包含数999(三个9)
$ grep '9{3,\}' data.f
查询重复出现次数一定的所有行,数字9重复出现两次
$ grep '9\{2\}' data.f
查询数字9重复出现2到6次,并以8结尾
$ grep '9\{2,6\}8' data.f
47      Oct     3ZL1998 LPSX    43.00   KVM9D   512
483     may     5PA1998 USP     37.00   KVM9D   644

8.使用grep匹配"与"或者"或"模式
grep命令加-E参数,这一扩展允许使用扩展模式匹配。
抽取城市代码为219或216
$ grep -E '219|216' data.f

9.空行
使用^和$可查询空行。使用-n显示实际行数
$ grep '^$' data.f

10.匹配特殊字符
查询诸如$.'"*[]^|\+?,必须在特定字符前加\
查询"."
$ grep '\.' myfile
查询"""
$ grep '\"' myfile
要查询文件名conftroll.conf
$ grep 'conftroll\.conf' myfile

11.查询格式化文件名
在文件filename.deposit中查询
a-z重复了1-6次,然后是"." ,最后为大写字母,重复1-2次
$ grep '[^a-z]\{1,6\}\.[^A-Z]\{1,2\}' filename.deposit

12.查询IP地址
$ grep '[0-9]\{3,\}\.[0-9]\{3,\}\.' data.f
123.134.999

类名
grep 允许使用国际字符模式匹配或匹配模式的类名形式。
  类名及其等价的正则表达式
--------------------------------------------------
 类    等价的正则表达式
--------------------------------------------------
 [[:upper:]]   [A-Z]
 [[:lower:]]   [a-z]
 [[:digit:]]   [0-9]
 [[:alnum:]]   [0-9a-zA-Z]
 [[:space:]]   空格或tab键
 [[:alpha:]]   [a-zA-Z]
--------------------------------------------------

使用通配符
$ grep 'l.*s' testfile
looks
likes

系统grep命令
1.目录
查询目录列表中的目录
$ ls -l | grep '^d'
在一个目录中不包含目录的所有文件
$ ls -l | grep '^[^d]'
要查询其他用户和其他用户组成员有可执行权限的目录集合
$ ls -l | grep '^d.....x..x'

2.passwd文件
$ grep "louise" /etc/passwd

使用grep命令-s开关,可屏蔽错误信息
$ grep -s "louise" /etc/password
$

如果grep命令不支持-s开关,可替代使用以下命令:
$ grep "louise" /etc/password >/dev/null 2>&l
/dev/null为比特池,有进没有出。

保存grep命令的查询结果
$ grep "louise" /etc/passwd >/tmp/passwd.out

3.使用ps命令
ps -ef 显示系统上运行的所有进程列表
$ ps -ef | grep "named"
grep命令创建了相应进程,ps -ef将找到它,使用-v选项可丢弃ps命令中的grep进程
$ ps -ef | grep named | grep -v "grep"

4.对一个字符串使用grep
使用echo字符串命令,然后对grep命令使用管道输入
$ STR = "Mary Joe Peter Pauline"
$ echo $STR | grep "Mary"

 

阅读(1343) | 评论(0) | 转发(0) |
0

上一篇:awk

下一篇:正则表达式

给主人留下些什么吧!~~