一、 简介

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrepfgrep

     grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。 
     grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
    Grep命令中允许指定的串语句是一个规则表达式,这是一种允许使用某些特殊键盘字符的指定字符串的方法,这种方法中的特殊键盘字符可以用于代表其他字符也可以进一步定义模式匹配工作方式。例如:grep ".*hood" essay1。该命令将在文件essay1中搜索,显示出包含带有字符串hood的字的每一行。命令行中的点表示的是hood之前可以有任意字符,星号指的是在字符串之前点号所表示的任意字符可以有任意个(其中的双引号是可有可无的,但是当语句中包含短语或者空格时就必须加双引号)[1] 
 
二、用法
(1)   表达符集
1、^       锚定行的开始 ,如'^google'匹配所以以google开头的行
2、$       锚定行的结束, 如'goolge$'匹配所以以google结束的行
3、.        匹配一个非换行符('\n')字符, 如‘gr.p'匹配gr后接一个任意字符
4、*       匹配零个或多个先前字符
5、[]      匹配一个指定范围内的字符,如'[Gg]rep' 匹配Grep和grep
6、[^]   匹配一个不在指定范围内的字符,如:'[^A-FH-Z]rep'匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。
7、\<    锚定单词的开始,如:'\<grep'匹配包含以grep开头的单词的行。

8、\>    锚定单词的结束,如'grep\>'匹配包含以grep结尾的单词的行。
9、x\{m\}   重复字符x,m次,如:'o\{5\}'匹配包含5个o的行。
10、x\{m,\}  重复字符x,至少m次,如:'o\{5,\}'匹配至少有5个o的行。
11、x\{m,n\}  重复字符x,至少m次,不多于n次,如:'o\{5,10\}'匹配5--10个o的行。
12、\w  匹配文字和数字字符,也就是[A-Za-z0-9],如:'G\w*p'匹配以G后跟零个或多个文字或数字字符,然后是p。
13、\W  \w的反置形式,匹配一个或多个非单词字符,如点号句号等。
14、\b  单词锁定符,如: '\bgrep\b'只匹配grep。[2] 
15、\+  匹配一个或多个先前的字符。如:'[a-z]\+able',匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。
16、\?  匹配零个或一个先前的字符。如:'gr\?p'匹配gr后跟一个或没有字符,然后是p的行。
17、a\|b\|c  匹配a或b或c。如:grep|sed匹配grep或sed
18、\(\)   分组符号,如:love\(ab\le\|rs\)ov\+匹配loveable或lovers,匹配一个或多个ov。

(2)命令选项

1、-?                    同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。
2、-a, --text             等价于匹配text,用于(Binary file (standard input) matches)报错
3、-b,--byte-offset      打印匹配行前面打印该行所在的块号码。
4、-c,--count                 只打印匹配的行数,不显示匹配的内容。
5、-f File,--file=File      从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。
6、-h,--no-filename     当搜索多个文件时,不显示匹配文件名前缀。
7、-i,--ignore-case      忽略大小写差别。
8、-o, --only-matching   只显示正则表达式匹配的部分。(show only the part of a line matching PATTERN)
9、-q,--quiet           取消显示,只返回退出状态。0则表示找到了匹配的行。
10、-l,--files-with-matches  打印匹配模板的文件清单。
11、-L,--files-without-match    打印不匹配模板的文件清单。
12、-n,--line-number      在匹配的行前面打印行号。
13、-s,--silent    不显示关于不存在或者无法读取文件的错误信息。
14、-v,--revert-match   反检索,只显示不匹配的行。
15、-w,--word-regexp   如果被\<和\>引用,就把表达式做为一个单词搜索。
16、-R, -r, --recursive     递归的读取目录下的所有文件,包括子目录。 比如grep -R 'pattern' test会在 test 及其子目录下的所有文件中,匹配 pattern。
17、-V,--version           显示软件版本信息。
18、-A6          查找某些字符的内容,并下延伸6行
19、-B6          查找某些字符的内容,并上延伸2行
20、-C1          查找某些字符的内容,并上和向下各延伸1行
这几行后面的数字直接影响延伸数量,并以--符号分割搜索行的结果
三、实例
1、$ ls -l | grep '^a'         通过管道过滤ls -l输出的内容,只显示以a开头的行。
2、$ grep 'test' d*       显示所有以d开头的文件中包含test的行。
3、$ grep 'test' aa bb cc  显示在aa,bb,cc文件中匹配test的行。
4、$ grep '[a-z]\{5\}' aa 显示所有包含每个字符串有5个连续小写字符的字符串的行。
5、$ grep 'w\(es\)t.*\1' aa  如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成'w(es)t.*\1'就可以了。
6、 ps -ef|grep clustal2       查找指定进程“clustal2”
      ps -ef|grep clustal2|wc -l     查找指定进程“clustal2”的运行个数
  1. ps -ef|grep clustal2
  2. longpen+ 27347 26704 0 11:13 pts/5 00:00:00 grep --color=auto clustal2

ps -ef|grep clustal2|wc -l
  1

7、cat test.txt | grep -f test2.txt

  1. [root@localhost test]# cat test.txt
  2. hnlinux
  3. peida.cnblogs.com
  4. ubuntu
  5. ubuntu linux
  6. redhat
  7. Redhat
  8. linuxmint
  9. [root@localhost test]# cat test2.txt
  10. linux
  11. Redhat
  12. [root@localhost test]# cat test.txt | grep -f test2.txt
  13. hnlinux
  14. ubuntu linux
  15. Redhat
  16. linuxmint
  17. [root@localhost test]#

8、cat test.txt |grep -E "ed|at"    显示包含ed或者at字符的内容行

9、grep '[a-z]\{7\}' *.txt             显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行
 
 
注、1、在正则表达式中,注意转义字符的使用。如 
grep "$a" file #引用变量a,查找变量a的值 
grep '$a' file #查找“$a”字符串 
grep '\\' file #查找‘\’字符
grep "\\\\" file # 由于是双引号,shell先把\\转义,就成了\,grep接收到的只有\\\,\是特殊字符 ,后面应该跟需要转义的字符,也就是\\,所以如果直接使用"//"那么就出现了错误。

[1] 来自百度百科

shell命令之一天一见:grep的更多相关文章

  1. shell命令之一天一见

    一.在统计行数时常要用的到命令包括 w.c.l, 在这里做个简单的介绍. 语法:wc [选项] 文件… 说明:该命令统计给定文件中的字节数.字数.行数.如果没有给出文件名,则从标准输入读取.wc同时也 ...

  2. shell命令之一天一见:awk

    AWK是一种优良的文本处理工具,Linux及Unix环境中现有的功能最强大的数据处理引擎之一. 这种编程及数据操作语言(其名称得自于它的创始人阿尔佛雷德·艾侯.彼得·溫伯格和布萊恩·柯林漢姓氏的首个字 ...

  3. 几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk

    find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 查找所有字母开 ...

  4. linux shell编程学习笔记(二) --- grep命令

    Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expression Print,表示全局正则表达 ...

  5. shell 命令 grep -v

    grep -v shell命令中,grep命令,是对文本行的搜索命令.grep -v就是反向文本行搜索. 当控制台输出很多时,有很多是我们不想看到的,就可以用到grep -v命令 举个栗子:ls -l ...

  6. Shell 命令行获取本机IP,grep的练习

    Shell 命令行获取本机IP,grep的练习 在 mac 下面输入 ifconfig 或者在 linux 下面输入 ip a 就可以得到我们的网卡信息.不过通常情况下,我们需要查看的是我们的IP地址 ...

  7. Shell常用工具find,grep,sed,awk,xargs命令

    最近学习shell命令,对grep,sed,awk命令有点混乱,故小结一下,巩固一遍. 注意:find , grep , sed, awk可使用基本正则表达式字符,find,grep,awk也支持扩展 ...

  8. Shell命令-文件及内容处理之grep(egrep)、join

    文件及内容处理 - grep(egrep).join 1. grep(egrep):文本过滤工具 grep(egrep)命令的功能说明 grep命令是Linux系统中最重要的命令之一,其功能是从文本文 ...

  9. Shell命令和流程控制

    Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字 ...

随机推荐

  1. java数据结构之常用排序算法

    冒泡排序 private void maopao(int arr[]) { for (int i = 0; i < arr.length; i++) { for (int j = 0; j &l ...

  2. Notepad++中安装json格式化插件

    在线工具固然好,一旦没网就凉凉 Notepad++编辑器中提供了 json 数据格式化显示的插件 安装插件过程如下: 注意: 安装过程需要联网状态 插件安装过程会自动退出程序,等待几秒钟后插件安装完成 ...

  3. Linux 踩坑记

    # Linux docker内部执行apt-get install 报错 在某个项目中使用docker构建mysql容器后想要在容器中修改mysql的配置文件,使用vim后提示 bash: vim: ...

  4. git stash使用

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/daguanjia11/article/ ...

  5. Redis系列之----Redis的数据类型及使用场景

       Redis是一个开源的.高性能的.基于键值对的缓存与存储系统,能够提供多种不同的键值数据类型来适应不同场景下的缓存和存储需求.    Redis中所有的数据都存储在内存中,因此读写速度非常快,相 ...

  6. 虚拟机下 windows 自动配置 IPv4 地址 169.254.X.X(首选)

    问题: windows server上,自己手动配置的ip不生效,自动获取地址虽然ok,但是服务器必须指定ip. 诊段: ipconfig/all里查看 自动配置 IPv4 地址  169.254.X ...

  7. MySQL UTF-8 常用字符排序规则

    排序规则 解释 utf8_general_ci 不区分大小写 utf8_general_cs 区分大小写 utf8_bin 区分大小写,字符串每个字符串用二进制数据编译存储,且支持存储二进制数据

  8. python爬虫——requests库使用代理

    在看这篇文章之前,需要大家掌握的知识技能: python基础 html基础 http状态码 让我们看看这篇文章中有哪些知识点: get方法 post方法 header参数,模拟用户 data参数,提交 ...

  9. Java入门 - 语言基础 - 07.修饰符

    原文地址:http://www.work100.net/training/java-modifier-type.html 更多教程:光束云 - 免费课程 修饰符 序号 文内章节 视频 1 概述 2 访 ...

  10. 在eclipse中用java调用python报错 Exception in thread "main" ImportError: Cannot import site module and its dependencies

    最近做项目需要用java调用python,配置了jython后,运行了例子代码: 获得一个元组里面的元素: import org.python.util.PythonInterpreter; publ ...