grep 使用随笔----运维笔记

grep(global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,能使用正则表达式搜索文本,并把匹配的行打印出来。grep主要作用是过滤出指定的行,指定的行满足什么条件,满足的条件可配合正则表达式来表示,实现强大的文本处理。

一、什么是正则表达式?

       正则表达式(Regular Expression):由一类特殊字符及文本字符所编写的模式,其有些字符不表示其字面意义,而是用于表示控制或通配的功能。正则表达式只是字符串的一种描述(一种表示法),只有和支持正则表达式的工具相结合才能进行字符串处理。

1.1、正则表达式的构成:

       正则表达式由元字符文本字符两种字符构成。

1.2、主要分为两类:

1、基本正则表达式 (BRE)    
   
2、扩展正则表达式 (ERE)

1.3 特殊字符类:

     POSIX字符类:为了在不同国家的字符编码中保持一致,POSIX(The Portable Operating System Interface)增加了特殊的字符类。以[:classname]的格式给出,grep命令支持POSIX字符类

类名

意义

[:upper:] 表示大写字母[A~Z]
[:lower:] 表示小写字母[a~z]

[:digit:]

表示阿拉伯数字[0~9]

[:alnum:]

表示大小写字母和阿拉伯数字[A~Za~z0~9]

[:space:]

表示任何产生空白的字符,包括空格或Tab键等

[:alpha:]

表示大小写字母[A~Za~z]

[:cntrl:]

表示键盘的控制按键,包括Tab、Del等按键
[:graph:] 表示除了空格符(空格键与Tab键)外的其他所有按键
[:print:] 表示任何可以被打印出来的字符
[:xdigit:] 表示十六进制数字[0~9A~Fa~f]
[:blank:] 表示空格键与Tab键
[:punct:] 表示标点符号,包括:" ' ? ! ; : # $... 


二、grep命令的使用

  2.1、 grep 家族有三个成员分别是:

 grep:默认支持基本正则表达式.

 egrep:默认支持扩展正则表达式,相当于grep -E.

 fgrep:不支持使用正则表达式.

2.2、命令格式

grep [OPTIONS] PATTERN [FILE...]
grep [OPTION...] -e PATTERNS ... [FILE...]
grep [OPTION...] -f PATTERN_FILE ... [FILE...]

2.3、OPTIONS:匹配方式选择

-E   : 启用扩展正则表达式(ERE),可使用扩展元字符。
-F   : 指定的模式被解释为字符串,不支持正则表示式。主要是在简单搜索中增快搜索速度。
-G   : 启用基本正则表达式(BRE)。
-P   :启用perl的正则表达式。(PCRE)

 例:如过滤文件中有.*字符的行
    [root@localhost opt]# cat file
    Paget 6 Status: 200
    Paget 6 Status: 200.*
    Page 1 Body:  .*.
    Page 9 Body:  ...
    [root@localhost opt]# grep -F '.*' file
    Paget 6 Status: 200.*
    Page 1 Body:  .*.

2.4、OPTIONS:匹配控制

-i:  不区分模式 PATTERN 和输入文件中的大小写。

-v:  反向选择,即输出没有匹配的行。

-w:  只能匹配完整的单词,首先单词字符只能是字母、数字、下划线.
     除此之外的字符都是非单词字符.这个单词的前一个字符和后一个字符都必须是非单词字符.

-x:  匹配完整的一行
     例:[root@localhost ~]# cat file
         come here
         come
         here come here
         [root@localhost ~]# grep -x "come" file
         come

-f FILE:  从文件FILE中获取模式,每行一条匹配.空文件含有0个模式,因此不匹配任何东西.

-e PATTERNS: 通过-e来指定多个表达式,只要满足其中一个表达式就输出。防止你对一个文件grep多次
             例: grep -e "come" -e "here" file 

2.5、OPTIONS:输入控制

-c:   只打印有多少行匹配。不显示匹配的内容.

-l:   打印出匹配的文件名.这个选项经常与find结合,比如你的/etc下搜索 linux 字符
      很可能有很多行 但是也许文件数并不多,所以,可以 find /etc | xargs grep -l "dhcp"

-L:   打印不匹配的文件名,和-l相反,一般和find一起发功.

-o:   只显示匹配的内容,而不是整行.

-q:   什么也不输出,即使发生错误,只要有满足匹配模式的行,就返回0

-s:   忽略错误和遇到不可读的文件时的信息。和-q都是不可移植的选项.建议用2> /dev/null 代替.

-NUM : 同时显示匹配行上下的NUM行.
       例: grep -2 pattern filename同时显示匹配行的上下2行

--colour[=WHEN]: 高亮显示匹配的内容(WHEN值可以为never 、always或 auto)

2.6、OPTIONS:输出行前缀控制

类型 详解 grep  egrep
字符匹配 匹配任意单个字符 . .
匹配指定范围内的任意单个字符 [ ] [ ]
匹配指定范围外的任意单位字符 [^] [^]
匹配次数 匹配其前面的字符任意次 * *
匹配任意升序的任意字符 .* .*
匹配其前面的字符0次或1次 \? ?
匹配其前面的字符1次或多次 \+ +
匹配其前面的字符m次 \{m\} {m}
匹配其前面的字符至少m次,至多n次 \{m,n\} {m,n}
匹配其前面的字符至多n次 \{0,n\} {0,n}
匹配其前面的字符至少m次 \{m,\} {m,}
位置锚定 行首 ^ ^
行尾 $ $
空白行 ^$ ^$
空行或包含空白字符的行 ^[[:SPACE"]]*$ ^[[:SPACE"]]*$
词首锚定 \< \<
词尾锚定 \> \>
分组及引用 匹配完整单词 \ \
分组及引用 () 此处左右括号要加\,主要是加了\不显示,特此备注下 ()
  a\|b a|b

贪婪匹配 详解 懒惰字符 详解
*

默认都是贪婪匹配,即找出最长的匹配模式

*? 找出最短的匹配模式
+

默认都是贪婪匹配,即找出最长的匹配模式

+? 找出最短的匹配模式
{n,} 默认都是贪婪匹配,即找出最长的匹配模式 {n,}? 找出最短的匹配模式

你可能感兴趣的:(linux,运维)