首页 > 代码库 > 基础正则表达式和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. 过滤不带有某个关键词的行,并输出行号

[image]

 # grep -vn “root”/etc/passwd

  显示在etc/passwd下 不含有root的行和行号

c. 过滤出所有包含数字的行

[image]

 你可以先创建一个文件 #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. 过滤出文档中以某个字符开头或者以某个字符结尾的行

[image]

  # grep "^r.*t$" /etc/passwd   查找在、etc/passwd下fei

   注:  所有行中含有以r开头以t结尾中间可以是任意字符的行

在正则表达式中,”^”表示行的开始,”$”表示行的结尾,那么空行则表示”^$”,如果你只想筛选出非空行,则可以使用 “grep -v ‘^$’ filename”得到你想要的结果

[image]


e. 过滤任意一个字符与重复字符

 # grep “r..o”/etc/passwd

     显示所有含r..o的文件

[image]

“.”表示任意一个字符,上例中,就是把符合ro之间有两个任意字符的行过滤出来

“*”表示零个或多个前面的字符

[image]

f. 指定要过滤字符出现的次数

   # grep "1\{1,3}\" /etc/passwd

      显示含有1(并且至少含有1个之多含有三个)的文件

[image]

这里用到了{ },其内部为数字,表示前面的字符要重复的次数上例中表示包含有两个’oo’的行注意,{ }左右都需要加上脱意字符’\’另外,使用{ }我们还可以表示一个范围的,具体格式是 ‘\{n1,n2\}’其中n1<n2,表示重复n1n2次前面的字符,n2还可以为空,则表示大于等于n1

1:上面部分说的grep,另外我们常常用到egrep这个工具,简单来说,后者是前者的扩展版本,我们可以用egrep完成grep不能完成的工作,当然了grep能完成的egrep完全可以完成如果你嫌麻烦,egrep了解一下即可,因为grep的功能已经足够介绍egrep不用于grep的几个用法为了试验方便

筛选一个或一个以上前面的字符

   # egrep “0+”/etc/passwd

         显示文件中含有一个0或一个以上的0的文件

[image]

grep 不同的是,egrep这里是使用’+’

b. 筛选零个或一个前面的字符


#egrep  “0?”/etc/passwd

  筛选出文件(含有一个或者零个)0的文件

[image]

c. 筛选字符串1或者字符串2

 # egrep “abc|123” /etc/passwd

   s筛选出含有abc或者123的文件

[image]

中间有一个’|’表示或者的意思,笔者用这个用的很多,所以这个你最好记一下

d.egrep’( )’的应用

[image]

’( )’表示一个整体,例如(oo)+就表示1’oo’或者多个’oo’

[image]

语法:
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