天天看点

grep命令详解

    grep是一款非常好用的文本查找工具它的全称为global regular expression print(全局正则表达式打印)grep家族的成员有grepegrepfgrep。grep支持基本的正则表达式元字符而egrep是扩展的grep支持更多的正则表达式元字符fgrep是快速grep元字符在其中不起作用只匹配它们本身这个不常用。

   而grep是干什么用的呢它是一个文本查找工具它能在指定的一个或是多个文件中查找到模式匹配的指定的行然后经过处理把此行显示出来原文件不变。grep的模式是非常重要的它定义了查找条件。grep的模式可以用引号括起来或是不括(''表示强引用“”表示弱引用)但是如果模式中有空格的话就必须括起来模式之后的所有字符都视为文件名。说到了模式不得不提的就是元字符了它使用户能精确的指定要匹配的模式。grep命令的使用格式为grep [options] pattern filename...

grep常用的元字符有

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>  </code><code>^   行首锚定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"^root"</code> <code>/etc/passwd 匹配passwd文件中以root开头的行 --color=</code><code>auto</code><code>不是一定要加加的话可以看出效果</code>

<code>  </code><code>$   行尾锚定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"bash$"</code> <code>/etc/passwd 匹配passwd文件中以bash结尾的行</code>

<code>      </code><code>grep --color=</code><code>auto</code> <code>"^root$"</code> <code>/etc/passwd 匹配passwd文件中以root开头并且只有root这个单词的行</code>

<code>  </code><code>\&lt;  词首锚定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"\&lt;ro"</code> <code>/etc/passwd 匹配passwd文件中以ro开头的单词</code>

<code>  </code><code>\&gt;  词尾锚定符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"sh\&gt;"</code> <code>/etc/passwd 匹配passwd文件中以sh结尾的单词</code>

<code>      </code><code>grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 精确匹配root这个单词</code>

<code>  </code><code>.   匹配任意单个字符某些特殊字符不匹配如换行符</code>

<code>  </code><code>*   匹配</code><code>"此前"</code><code>的任意字符0次或任意次</code>

<code>  </code><code>例  grep --color=</code><code>auto</code> <code>"r*"</code> <code>/etc/passwd 匹配r字符后跟任意个r的字符的行</code>

<code>    </code><code>匹配此前的字符0次或1次</code>

<code>  </code><code>\{m,n\} 匹配此前的字符至少m次至多n次</code>

<code>  </code><code>\{m,\}  匹配此前的字符至少m次</code>

<code>  </code><code>\{n\}   匹配此前的字符n次</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"ro\{1,3\}"</code>  <code>/etc/passwd 匹配ro并且后跟1或2或3个o的字符串</code>

<code>  </code><code>[]   匹配指定范围内的任意单个字符</code>

<code>  </code><code>[^]  匹配指定范围外的任意单个字符</code>

<code>  </code><code>例grep --color=</code><code>auto</code> <code>"r[a-z]ot"</code> <code>/etc/passwd 匹配r并且后面试a-z中的任意单个字母再后为ot</code>

<code>  </code><code>\(\) \1 \2...  标记匹配到的字符或字符串模式中用最多可以标记9个用\1,\2引用</code>

<code>  </code><code>grep --color=</code><code>auto</code> <code>"r\(o\)\1t"</code> <code>/etc/passwd 匹配文件中包含root的行</code>

grep的常用选项有

<code>--color=</code><code>auto</code> <code>对匹配到字符加颜色</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 匹配到有root这个单词的行并且把root加颜色</code>

<code>  </code><code>-n   在匹配的行前面显示此行在文件中的行号</code>

<code>  </code><code>-v   显示匹配不到的行</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>"\&lt;root\&gt;"</code> <code>/etc/passwd 显示没有root的行</code>

<code>  </code><code>-i   匹配字符时忽略大小写</code>

<code>  </code><code>例:# grep --color=</code><code>auto</code> <code>-i </code><code>"rooT"</code> <code>/etc/passwd 即有root或rooT的行都匹配</code>

<code>  </code><code>-r   在指定目录下搜索目录中的多个文件</code>

<code>  </code><code>例:# grep -r --color=</code><code>auto</code> <code>inittab /etc/ 匹配etc目录中所有文件中有inittab的行</code>

<code>  </code><code>-B n 当匹配某行之后把其之前的n行也显示</code>

<code>  </code><code>-A n 当匹配某行之后把其之后的n行也显示</code>

<code>  </code><code>-C n 当匹配某行之后把其之前之后的n行都显示</code>

<code>  </code><code>例:# grep -C 2 --color=</code><code>auto</code> <code>root /etc/passwd 匹配有root的行并把此行上下的2行也显示出来</code>

<code>  </code><code>-o   只显示匹配的字符串本身而非显示整行。一行中有多个符合pattern的字符串都会显示出来</code>

<code>  </code><code>例:# grep -o --color=</code><code>auto</code> <code>root /etc/passwd 匹配root并且只显示匹配到的内容root,以回车分割</code>

<code>    </code><code># head -n 1 1.txt |grep -o </code><code>' or '</code><code>|wc -l 统计1.txt的第一行有几个or</code>

<code>  </code><code>-E   使用扩展的grep这样grep -E 的功能和egrep就一样了</code>

<code>  </code><code>-e   -e就是用来保护grep的选项的</code>

<code>  </code><code>例如1.txt中只有</code><code>"-vb-"</code><code>这一行则grep --color=</code><code>auto</code> <code>“-vb-” 1.txt 匹配的是b-也就是说grep把-v当成了他的选项了不匹配。</code>

<code>而  grep --color=</code><code>auto</code> <code>-e “-vb-” 1.txt,匹配的就是-vb-也就是说忽略了-v。</code>

<code>   </code><code>grep也常常用于脚本中因为grep命令的执行之后会有一个退出码正确执行退出码是0如果在文件中没有找到与模式匹配的字符串退出码为1如果根本没有找到这个文件退出码为2这个在脚本中运用广泛。</code>

<code>  </code><code>例grep </code><code>"root"</code> <code>/etc/passwd</code>

<code>      </code><code>echo </code><code>"$?"</code>  <code>会显示上这个grep命令执行后的退出码</code>

本文转自 leejia1989 51CTO博客,原文链接:http://blog.51cto.com/leejia/787155,如需转载请自行联系原作者