首页 > 代码库 > 基础正则表达式和fgrep详解
基础正则表达式和fgrep详解
【grep/ egrep】
语法: grep [-cinvABC] ‘word’filename
-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
#grep -A 2 halt /etc/passwd
a. 过滤出带有某个关键词的行并输出行号
# grep -n “root ” /etc/passwd
显示内容是在etc/passwd 中含有root的行
b. 过滤不带有某个关键词的行,并输出行号
# grep -vn “root”/etc/passwd
显示在etc/passwd下 不含有root的行和行号
c. 过滤出所有包含数字的行
你可以先创建一个文件 #touch test.txt
在里面输入一些子母行 数字行
然后# grep “[0-9]”test,.txt 显示数字行
grep -v“[0-9]”test,.txt 显示非数字行
在前面也提到过这个”[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符
这就表示筛选包含oo字符串,但是不包含r字符。
d. 过滤出文档中以某个字符开头或者以某个字符结尾的行
# grep "^r.*t$" /etc/passwd 查找在、etc/passwd下fei
注: 所有行中含有以r开头以t结尾中间可以是任意字符的行
在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果。
e. 过滤任意一个字符与重复字符
# grep “r..o”/etc/passwd
显示所有含r..o的文件
“.”表示任意一个字符,上例中,就是把符合r与o之间有两个任意字符的行过滤出来。
“*”表示零个或多个前面的字符。
f. 指定要过滤字符出现的次数
# grep "1\{1,3}\" /etc/passwd
显示含有1(并且至少含有1个之多含有三个)的文件
这里用到了{ },其内部为数字,表示前面的字符要重复的次数。上例中表示包含有两个o 即’oo’的行。注意,{ }左右都需要加上脱意字符’\’。另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘\{n1,n2\}’其中n1<n2,表示重复n1到n2次前面的字符,n2还可以为空,则表示大于等于n1次。
1:上面部分说的grep,另外我们常常用到egrep这个工具,简单来说,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成。如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够介绍egrep不用于grep的几个用法。为了试验方便
. 筛选一个或一个以上前面的字符
# egrep “0+”/etc/passwd
显示文件中含有一个0或一个以上的0的文件
和grep 不同的是,egrep这里是使用’+’的。
b. 筛选零个或一个前面的字符
#egrep “0?”/etc/passwd
筛选出文件(含有一个或者零个)0的文件
c. 筛选字符串1或者字符串2
# egrep “abc|123” /etc/passwd
s筛选出含有abc或者123的文件
中间有一个’|’表示或者的意思,笔者用这个用的很多,所以这个你最好记一下。
d.egrep中’( )’的应用
用’( )’表示一个整体,例如(oo)+就表示1个’oo’或者多个’oo’
语法:
grep [选项][查找模式][文件名1,文件名2,……]
egrep [选项][查找模式][文件名1,文件名2,……]
fgrep [选项][查找模式][文件名1,文件名2,……]
这组命令各选项的含义为:
- E 每个模式作为一个扩展的正则表达式对待。
- F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。
- b在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
- c 只显示匹配行的数量。
- i 比较时不区分大小写。
- h 在查找多个文件时,指示grep不要将文件名加入到输出之前。
- l 显示首次匹配串所在的文件名并用换行符将其隔开。当在某文件中多次出现匹配串时,不重复显示此文件名。
- n 在输出前加上匹配串所在行的行号(文件首行行号为1)。
- v 只显示不包含匹配串的行。
- x 只显示整行严格匹配的行。
- e expression 指定检索使用的模式。用于防止以“-”开头的模式被解释为命令选项。
- f expfile 从expfile文件中获取要搜索的模式,一个模式占一行。
相当于执行grep指令加上参数"-F",详见grep指令说明。
fgrep 命令于 grep 和 egrep 命令不同,因为它搜索字符串而不是搜索匹配表达式的模式。fgrep 命令使用快速的压缩算法。$, *, [, |, (, ) 和 \ 等字符串被 fgrep 命令按字面意思解释。这些字符并不解释为正则表达式,但它们在 grep 和 egrep 命令中解释为正则表达式。因为这些字符对于 shell 有特定的含义,完整的字符串应该加上单引号(‘ ... ’)。. 如果没有指定文件, fgrep 命令假定标准输入。一般,找到的每行都复制到标准输出中去。如果不止一个输入文件,则在找到的每行前打印文件名。
4注意:编辑
1. fgrep 命令和带 -F 标志的 grep命令是一样的但出错和用法消息不同-s 标志功能也不同。
2. 每行限制在 2048 个字节。
3. 段落(-p 标志下)目前限制在5000个字符的长度。
4. 不要在特定的文件中运行 grep 命令,因为会产生不可预料的结果。
5. 输入行不能包含空字符。
6. 输入文件应该以换行字符结尾。
7. 虽然可以同时指定很多标志,但某些标志会覆盖其余的标志。例如,如果同时指定 -l 和 -n ,只有文件名写入到标准输出中去。
标志
-b 在找到的每行之前添加行所在的块编号。使用此标志有助于按照上下文查找磁盘块号码。-b 标志不能用于标准输入或者管道输入。
-c 仅显示匹配行的计数。
-e 模式指定模式。这个工作模式很简单,但当此模式以 a-(减号) 开头时却是很有用的。
-f StringFile 指定包含字符串的文件。
-h 当多个文件被处理时隐藏文件名。
-i 当进行比较时忽略字母的大小写。
-l 只列出包含匹配行的文件名(一次)。文件名之间用换行符分隔。
n 将文件中每行的相对行号置于行前。
-pSeparator 显示包含匹配行的整个段落。段落之间将按照Separator参数指定的段落分隔符加以分隔,这些分隔符是与搜索模式有着相同格式的模式。包含段落分隔符的行将仅用作分隔符;它们不会被包含在输出中。缺省的段落分隔符是空白行。
-q 禁止所有写入到标准输出的操作,不管是否为匹配行。如果选中输入行,以 0 状态退出。
-s 仅显示出错消息。这在检查状态时很有用。
-v 显示除了匹配特定模式的行以外的所有行。
-w 执行单词搜索。
-x 显示匹配模式的行,要求无额外的字符。
-y 当进行比较时忽略字符的大小写。
5退出状态编辑
此命令返回以下出口值:
0 找到匹配项。
1 未找到匹配项。
>1 发现语法错误,或者文件不可访问(即使找到了匹配项)。
6示例编辑
1. 搜索几个文件中的一个简单字符串:
fgrep strcpy *.c
在当前目录下所有以 .c 字符串结尾的文件中搜索字符串 strcpy。
2. 计数匹配某模式的行数:
fgrep -c 『{』pgm.cfgrep -c 『}』pgm.c
显示在 pgm.c 中包含左括号和右括号的行的数目。
如果在您的 C 程序中一行中没有包含多于一个 { (左括号) 或者 } (右括号),并且括号正确匹配,那么这两个数字将是一样的。如果这两个数字不一样,您可以将包含括号的行按照他们在文件中的位置顺序显示出来,使用以下命令:
egrep {\|} pgm.c
3. 显示包含某模式的文件名:
fgrep -l strcpy *.c
搜索当前目录下以 .c 结尾的文件,然后显示包含 strcpy 字符串的文件名。
7文件编辑
/usr/bin/fgrep 包含 fgrep 命令。
/bin/fgrep 链接到 fgrep 命令的符号。
本文出自 “正则表达式和fgrep” 博客,请务必保留此出处http://9025736.blog.51cto.com/9015736/1437527