一.grep家族

1.grep使用基本正则元字符集。标准的grep 在默认情况下也支持以反斜杠开头的扩展正则元字符集。例如:\?,\+,\{,\|,\(,\);前面没有反斜杠的扩展元字符集对于标准的grep 无特别的含义。

2.egrep 是grep的扩展,用的是正则表达式元字符集的扩展集。

3.fgrep 就是fixed grep 或者fast grep,元字符只表示其自身的字面意义。

4.Linux 使用的是Gnu grep,为了符合POSIX标准,grep 增加了-G.-E 和-F选项,它们使你在拥有标准grep 所提供的功能的同时还拥有egrep 和fgrep的功能。Gnu grep 的使用格式如下:

grep   'pattern'  filename(s)

基本正则表达式元字符集(默认)

grep -G 'pattern' filename(s)

基本正则表达式元字符集(默认)

grep -E 'pattern' filebname(s)

扩展正则表达式元字符集

grep -F 'pattern' filename(s)

无正则表达式元字符集

5.当使用 egrep 命令时 \ (或者 \ (匹配文本中的括弧,但是 (和 )都是模式组部分中的特殊字符。在使用 grep 命令时,逆向也成立。

二.grep命令(grep lm - -color=auto /proc/cpuinfo)

1.grep 的含义

grep 的名字可以追溯到ex 编辑器。如果想启动ex 编辑器并打印所有包含pattern 的行,就需要输入:

: g/pattern/p

g 命令的意思是“文件中所有的行”或者“运行一个全文替代”。因为搜索模板被称为正则表达式,所以我们可以用RE 来替换模板,命令读为:

: g/RE/p

你看到了,这就是grep 命令的含义和名字的来源。它的意思是“全面搜索正则表达式并把找到的行打印出来(global search regular expression (RE) and print out the line)。

使用grep的好处是不用启动编辑器就可以运行查找,也不需要用斜杠把正则括起来。因此它比使用vi 和ex 更加快捷和方便。

2.grep 怎样工作

grep 命令在一个或者多个文件中搜索字符串模板。如果模板包括空格,则必须用引号。

模板可以是一个被引用的字符串,其后面的所有字符串被看作文件名。grep把搜索结果送到屏幕,但是不影响输入文件。

3.引号引用

在grep命令中输入字符串参数时,最好将其用引号括起来。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,

例如:“jet plane”,如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。

在调用变量时,也应该使用双引号,诸如:grep “$MYVAR”文件名,如果不这样,将没有返回结果。

在调用模式匹配时,应使用单引号。

4.grep的正则表达式元字符集(基本集)

基本集包括:^,$,.,*,[],[^],\<, \>。另外,Gnu 将\b,\w 和\W 作为POSIX 新增的正则元字符予以识别。

^          ^love

\(..\)b     \(love\)able

$           love$

x\{m\}     o\{5\}

.           l..e

x\{m,\}    o\{5,\}

*           *love

x\{m,n\}  o\{5,10\}

[]          [Ll]ove

\w     L\w*e

[^]         [^A-Z]ove

\W    love\W+

/<          \<love

\b   \blove\b

\>           love\>

 

5.POSIX字符类

为了处理不同的地区字符集,POSIX 加入了基本正则表达式和扩展正则表达式,表示这些类。

例如A-Za-z0-9 本身并是正则表达式,但是[A-Za-z0-9]就是。

同样[:alnum:]只有被写成[[:alnum:]]时才是正则表达式。

这两种形式的区别在于,第一种依赖的是ASCII字符编码,第二种依赖的是类中的其他语言,例如瑞典语或者德语。

Bracketed Class/含义

Bracketed Class/含义

[:alnum:] 文字数字字符

[:print:] 跟非空字符一样,但是包括空格

[:alpha:] 文字字符

[:graph:] 非空字符(非空格.控制字符)

[:digit:] 数字字符

[:punct:] 标点符号

[:upper:] 大写字符

[:xdigit:] 十六进制数字(0-9.a-f.A-F)

[:lower:] 小写字符

[:space:] 所有白空格字符(新行.空格.制表符)

[:cntrl:] 控制字符

 

#grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile

#grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile

#grep '[[:space:]]\.[[:digit:]][[:space:]]' datafile

#grep '5[[:upper:]][[:upper:]]' datafile

#grep '[[:upper:]]\.[[:upper:]][P,D]' datafile以P,D结尾的

6.grep.grep-G实例

grep –G NW file1        打印所有包含正则表达式NW的行。

grep NW d*               打印所有以d 开头的文件中且包含正则表达式NW 的行

grep  '^n ' file1        打印所有以n开头的行。^表示锚定行的开头。

grep  '4$ ' file1        打印所有以4结束的行。$表示锚定行的结尾。

grep TB Savage file1     第一个参数是模板,其他的参数是文件名

grep  'TB Savage ' file1 打印所有包含模板TB Savage的行。

grep  '5\.. ' file1      第一个是5,紧跟着一个点,再后是任意一个字符

grep  '\.5 ' file1       打印所有包含字符串“.5”的行。

grep  '^[we] ' file1     打印所有以w或者e开头的行。

grep  '[^0-9] ' file1    括号内的^表示任意一个不在括号范围内的字符。

grep  ' [A-Z][A-Z] [A-Z] ' file1打印所有包含前两个字符是大写字母,后面紧跟着一个空格及一个大写字母的字符串的行。例如,TB Savage和AM Main。

grep  'ss* ' file1        打印所有包含一个或者多个s 且后面跟有一个空格的字符串的行。比如,Charles 和Dalsass。

grep  ' [a-z]\{9\} ' file1打印所有包含每个字符串至少有9个连续小写字符串的行。

grep  '\(3\)\.[0-9].*\1 *\1 ' file1     第一个字符是3,紧跟着一个句点,然后是任意一个数字,然后是任意个数字,然后是一个3,然后是任意个制表符,然后又是一个3。因为3在一对圆括号中,它可以被后面的\1引用。

grep  '\<north ' file1    所有包含以north开始的单词的行。

grep  '\bnorth\b ' file1  在所有Gnu 版本的grep 中,\b是单词分界符

grep  '^n\w*\w ' file1  第一个字符是n,紧跟着是任意个字母或者数字字符,然后是一个非字母数字字符。在各种Gnu版本的grep中,\w 和\W都是标准的单词匹配符。

grep  '\<[a-z].*n\> ' file1 第一个字符是一个小写字母,紧跟着是任意个字符,然后以字符n结束。注意.*,它表示任意字符,包括空格。

#ls –l|grep '^[^d]' 不匹配行首

三.grep与选项(grep  <参数>  <正则>  <文件名>)

1. -A NUM,--after-context=NUM 除了列出符合行之外,并且列出后NUM行。

$grep-A 1 panda file从file中搜寻有panda样式的行,并显示该行的后1行

2. -a或--text  grep原本是搜寻文字文件,若加上-a参数则可将二进制档案视为文本文件搜寻,相当于--binary-files=text这个参数。

$grep-a panda mv

3. -B NUM,--before-context=NUM与 -A NUM 相对,同时输出匹配行的前num行。       

$grep-B 1 panda file          从file中搜寻有panda样式的行,并显示该行的前1行

4. -b, --byte-offset列出样式之前的内文总共有多少byte .. 根据上下文定位磁盘块时有用

$grep-bpanda file 显示结果类似于:

66:pandahuang

5.-c输出匹配行的计数只显示符合的总行数。加上-v,--invert-match显示不符合的总行数。

#grep -c '^ *$'  ch04      输出所有包含空行的行的数目

6. -C [NUM], -NUM, --context[=NUM]  列出符合行及上下各NUM行,默认值是2。

$grep-C[NUM] panda file

7.  -E, --extended-regexp采用规则表示式去解释样式。

8.  -f FILE, --file=FILE档案的一行为一个样式。然后采用档案搜寻。

$grep-f newfile file           //newfile为搜寻样式文件

9.  -G, --basic-regexp将样式视为基本的规则表示式解释。(此为预设)

10.  -i, --ignore-case匹配时忽略大小写

$grep-i panda mv

11.  -L, --files-without-match显示出没有符合的文件名称。

12.  -l, --files-with-matches 打印匹配模板的文件清单

#grep -l ‘\<PATH’ /etc/*      输出所有包含词的文件名

13.  -n, --line-number在显示行前,标上行号。

#grep -n ‘\<root\>   /etc/passwd             显示行号;严格匹配元字符:\<\>

#grep -n  /etc/passwd

14.  -q, --quiet, --silent只返回状态,0则表示找到了匹配的行

#grep -q nstall install.log && echo $?      若找到nstall则传回真值

15.  -r, --recursive-递归,到子目录中搜索,此相当于 -d recsuse 参数。

#grep –ir abc /usr                   忽略大小写;递归查找

16.  -v, --invert-match   显示除搜寻样式行之外的全部。

#grep -v -f file1 file2 && grep -v -f file2 file1删除两个文件相同部分

#grep -v ^# /etc/initab|grep -v ^$

17.  -w, --word-regexp执行单词搜索,完全符合该"单词"的行才会被列出,相当于\<和\>

#grep -w /hi/etc/fstab               输出所有包含词reg-exp的行

#grep “student\>” /ur/share/dict/words  精确匹配

18.-#        同时显示匹配行的上下#行;Grep -2 vim install.log

四.egrep或grep-E(行被限制在 2048 字节)

元字符

例子

+

重复至少“1个”前一个RE字符

#egrep –n ’go+d’ file1

?

重复至少“0个”前一个RE字符

#egrep '2\.?[0-9]' datafile  一个2后跟0或一个.,再跟一个数

|

用“or”方式找出字符串

#egrep -v '^$|^#' file1

#who|egrep -v ’^(matty|pauline)’     ^符号排除字符串

()

找出“群组”字符串

#egrep ‘(shutdown|reboot) (s)?’  file1

#echo 'AxyzxyzxyzC'|egrep 'A(xyz)+C'

(..)(…)\1\2

\(love\)ing\1rs    保存为变量并替换

x{m,n} 

o\{5\}        o\{5,\}      o\{5,10\}

#egrep ‘[a-z]{3,5}’ file1长度是3~5以小写字母组成的字串

#egrep ‘go{2,}gle’  some-file前面的字符>2个

#egrep  '^ [a-z]{5}' file1行首连续5个小写字母

grep -n '[0-9]\{6,\}$' datebook打印工资是6位数的行并给出行号