Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1699809
  • 博文数量: 163
  • 博客积分: 10591
  • 博客等级: 上将
  • 技术积分: 1980
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-08 18:17
文章分类

全部博文(163)

文章存档

2018年(1)

2012年(1)

2011年(47)

2010年(58)

2009年(21)

2008年(35)

分类:

2008-07-08 15:08:47

1.GNU grep 格式
 
 

grep 'pattern' filename(s)

grep -E 'pattern' filename(s)     等同egrep 'pattern' filename(s)

grep -F 'pattern' filename(s)     等同fgrep 'pattern' filename(s)

grep -P 'pattern' filename(s)

2.grep支持的正则表达式元字符集

2.1 基本集

 元字符  功能
 ^  行首定位符
 $  行尾定位符
 .  匹配单个字符
 *  匹配零个或多个字符
 []  匹配集合中的一个字符
 [^]  匹配非集合中的一个字符
 \<  词首定位符
 \>  词尾定位符
 \(..\)  标签匹配字符
 x\{m\}

 字符x重复m次

 x\{m,\}  字符x重复至少m次
 x\{m,n\}  字符x重复m到n次
 \w  所有字母与数字,称为[a-zA-Z0-9_]
 \W  所有字母与数字之外的字符,称为非字符[^a-zA-Z0-9_]
 \b  词边界

2.2 扩展集
 
 元字符  功 能
 +  匹配一个或多个前导字符
 ?  匹配零个或一个前导字符
 a|b|c  匹配a或b或c
 ()  组字符
 (..)(..)\1\2  标签匹配字符
 x{m}  字符x重复m次
 x{m,}  字符x重复至少m次
 x{m,n}   字符x重复m到n次
 
2.3 POSIX元字符
 
 括号类  含义
 [:alnum:]  字母与数字两种字符
 [:alpha:]  字母字符
 [:cntrl:]  控制字符
 [:digit:]  数字字符
 [:graph:]  非空字符(不包含空格、控制字符等)
 [:lower:]  小写字母
 [:print:]  与[:graph:]类似,但包含空格字符
 [:punct:]  标点字符
 [:space:]  所有的空白字符(换行符,空格符,制表符)
 [:upper:]  大写字母
 [:xdigit:]  十六进制数字字符(0-9a-fA-F)
 
3. grep的选项
 
 选项  作用

 -#

(# 是一个用来代表整数值的符号)

将匹配行前后#行的内容一同打印出来:也就是说,grep -2 pattern filename将导致grep打印匹配行的前两行和后两行 
 -A #, --after-context=#  打印匹配行后面#行的内容:也就是说,匹配行及它后面指定的#行内容
 -B #, --before-context=#  打印匹配行前面#行的内容:也就是说,匹配行及它前面指定的#行内容
 -C #, --context=# 等价于-2选项。打印匹配行的前两行和后两行 
 -V, --version  打印grep版本信息,版本信息应当包含在所有的bug报告中
 -a,--text,--binary-files=text  将二进制文件当作文本文件处理
 -b,--byte-offset  在输出的每行前显示便宜字节数
 -c,--count  为每行输入文件打印成功匹配的行数。-v则打印一些未匹配的行数
 -D action,--devices=action  如果输入文件为一个设备,如套接字或管道。则action默认从该设备读,就如同读一个普通文件一样。如果action为skip,则该设备被忽略
 -e PATTERN,--regexp=PATTERN  使用字面PATTERN作为模式:这对保护以-开头的模式非常有帮助
-f FILE, --file=FILE   从FILE中获得模式,每行一个。空文件包含0个模式,因此什么也不能匹配
 --help--  显示相关grep命令行选项及错误报告地址的帮助信息,然后退出
 -h,--no-filename  当搜索多个文件时,禁止输出文件名前缀
 -i,--ignore-case  忽略模式和输入文件的大小写区别
 -L,--files-without-match  仅打印所有未能匹配模式的文件名
 -l,--files-with-matches  仅打印所有正确匹配模式的文件名
 -m #,--max-count-#  如果文件是标准输入或正规文件,在找到指定数量(#)的匹配行后停止读文件
 -n,--line-number  在匹配成功的输出行前加上行号为前缀
 -q, --quiet  禁止正规输出。可用来替代-n
 -r,-R,--recursive,--directories=recurse  对列出的目录,递归地读并处理这些目录中的所有文件;也就是指该目录下的所有目录
 -s,--silent  禁止显示文件不存在或文件不可读的错误信息
 -v, --revert-match  转换匹配性质,选择非匹配行
 -w,--word-regexp  仅选择包含词匹配的行。匹配词边界上包含字母、数字和下划线的字符串
 -x,--line-regexp  仅选择精确匹配整行的哪些匹配
 -y  与已废除的-i同义
 -U,--binary  将文件作为二进制文件处理。仅有MS-DOS和MS-Windows支持该选项
 -u,--unix-byte-offsets  报告UNIX风格的字节偏移。这个选项仅在同时使用-b选项的情况下才有效;仅有MS-DOS和MS-Windows支持该选项 
 -Z,--null  在文件名的末尾放上ASCII空字符以取代换行符
 
4. 使用
 
4.1 返回值
 
grep返回的退出状态为0,表示成功,如果找不到模式,grep返回1,而当找不到要搜索的文件时,返回的退出状态是2。
 
4.2 使用元字符(特殊情况)
 
grep 使用基本元字符集,也可以使用POSIX元字符集,egrep(grep -E)还可以使用扩展集。
 
默认设置的grep也可以使用扩展集中的元字符,仅需要对这些元字符前置一个反斜线。如:
 

grep '3\+' datafile
grep -E '3+' datafile
egrep '3+' datafile

打印所有包含一个或多个3的行

 

grep '\(no\)\+' datafile
grep -E '(no)+' datafile
egrep '(no)+' datafile

打印包含一个或多个模式组no的行。

 

grep 'x\{m,n\}' datafile
grep -E 'x{m,n}' datafile
egrep 'x{m,n}' datafile

打印包含m个到n个x的行

 

grep 'S\(h\|u\)' datafile
grep -E 'S(h|u)' datafile
egrep 'S(h|u)' datafile

打印所有包含一个S后跟一个h或u(如Sh或Su)的行。

4.3 使用POSIX元字符

这种字符类,例如,[:alnum:]是A-Za-z0-9的另一种表达方式。为使用这种字符类,它必须使用另外一对括号进行引用以将其标识为一个正则表达式。例如,A-Za-z0-9本身并不是正则表达式,但[A-Za-z0-9]是。同样的,[:alnum:]应写作[[:alnum:]]。

4.4 固定的grep(grep -F 和fgrep)

它不能够识别任何正则表达式元字符的特殊意义。所有的字符仅能代表它们自身。如:

fgrep '[A-Z]****[0-9]' file

grep -F '[A-Z]****[0-9]' file

查找文件中包换[A-Z]****[0-9]的行。

4.5 使用选项

无论哪种形式的grep(egrep,fgrep) ,都可以使用选项。举个有点意思的例子:

$echo $LOGNAME
hrwang
$grep -i "$LOGNAME" datafile
Hrwang is a boy
$egrep -i "$LOGNAME" datafile
Hrwang is a boy
$fgrep -i "$LOGNAME" datafile
Hrwang is a boy

打印了shell环境变量LOGNAME的值,如果该变量被双引号引用,它还将被shell扩展。加入给该变量赋的值多于一个词,则shell进行解释时将屏蔽空白。如果是被单引号引用,则不会进行变量替换,也就是说,将会打印$LOGNAME。

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

上一篇:getopts

下一篇:sed

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