在Linux的grep命令中如何使用OR,AND,NOT操作符呢?

其实,在grep命令中,有OR和NOT操作符的等价选项,但是并没有grep AND这种操作符。不过呢,可以使用patterns来模拟AND操作的。下面会举一些例子来说明在Linux的grep命令中如何使用OR,AND,NOT。

在下面的例子中,会用到这个employee.txt文件,如下:

  1. $ cat employee.txt
  2. 100  Thomas  Manager    Sales       $5,000
  3. 200  Jason   Developer  Technology  $5,500
  4. 300  Raj     Sysadmin   Technology  $7,000
  5. 400  Nisha   Manager    Marketing   $9,500
  6. 500  Randy   Manager    Sales       $6,000

(一)Grep OR 操作符

以下四种方法均能实现grep OR的操作。个人推荐方法3.

1.使用 \|

如果不使用grep命令的任何选项,可以通过使用 '\|' 来分割多个pattern,以此实现OR的操作。

  1. grep 'pattern1\|pattern2' filename

例子如下:

  1. $ grep 'Tech\|Sales' employee.txt
  2. 100  Thomas  Manager    Sales       $5,000
  3. 200  Jason   Developer  Technology  $5,500
  4. 300  Raj     Sysadmin   Technology  $7,000
  5. 500  Randy   Manager    Sales       $6,000

2.使用选项 -E

grep -E 选项可以用来扩展选项为正则表达式。 如果使用了grep 命令的选项-E,则应该使用 | 来分割多个pattern,以此实现OR操作。

  1. grep -E 'pattern1|pattern2' filename

例子如下:

  1. $ grep -E 'Tech|Sales' employee.txt
  2. 100  Thomas  Manager    Sales       $5,000
  3. 200  Jason   Developer  Technology  $5,500
  4. 300  Raj     Sysadmin   Technology  $7,000
  5. 500  Randy   Manager    Sales       $6,000

3.使用 egrep

egrep 命令等同于‘grep -E’。因此,使用egrep (不带任何选项)命令,以此根据分割的多个Pattern来实现OR操作.

  1. egrep 'pattern1|pattern2' filename

例子如下:

  1. $ egrep 'Tech|Sales' employee.txt
  2. 100  Thomas  Manager    Sales       $5,000
  3. 200  Jason   Developer  Technology  $5,500
  4. 300  Raj     Sysadmin   Technology  $7,000
  5. 500  Randy   Manager    Sales       $6,000

4.使用选项 -e

使用grep -e 选项,只能传递一个参数。在单条命令中使用多个 -e 选项,得到多个pattern,以此实现OR操作。

  1. grep -e pattern1 -e pattern2 filename

例子如下:

  1. $ grep -e Tech -e Sales employee.txt
  2. 100  Thomas  Manager    Sales       $5,000
  3. 200  Jason   Developer  Technology  $5,500
  4. 300  Raj     Sysadmin   Technology  $7,000
  5. 500  Randy   Manager    Sales       $6,000

(二)Grep AND 操作

1.使用 -E 'pattern1.*pattern2'

grep命令本身不提供AND功能。但是,使用 -E 选项可以实现AND操作。

  1. grep -E 'pattern1.*pattern2' filename
  2. grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

第一个例子如下:(其中两个pattern的顺序是指定的)

  1. $ grep -E 'Dev.*Tech' employee.txt
  2. 200  Jason   Developer  Technology  $5,500

第二个例子:(两个pattern的顺序不是固定的,可以是乱序的)

  1. $ grep -E 'Manager.*Sales|Sales.*Manager' employee.txt

2.使用多个grep命令

可以使用多个 grep 命令 ,由管道符分割,以此来实现 AND 语义。

  1. grep -E 'pattern1' filename | grep -E 'pattern2'

例子如下:

  1. $ grep Manager employee.txt | grep Sales
  2. 100  Thomas  Manager    Sales       $5,000
  3. 500  Randy   Manager    Sales       $6,000

(三)Grep NOT操作

1.使用选项 grep -v

使用 grep -v 可以实现 NOT 操作。 -v 选项用来实现反选匹配的( invert match)。如,可匹配得到除下指定pattern外的所有lines。

  1. grep -v 'pattern1' filename

例子如下:

  1. $ grep -v Sales employee.txt
  2. 200  Jason   Developer  Technology  $5,500
  3. 300  Raj     Sysadmin   Technology  $7,000
  4. 400  Nisha   Manager    Marketing   $9,500

当然,可以将NOT操作与其他操作联合起来,以此实现更强大的功能 组合。

如,这个例子将得到:‘Manager或者Developer,但是不是Sales’的结果:

    1. $ egrep 'Manager|Developer' employee.txt | grep -v Sales
    2. 200  Jason   Developer  Technology  $5,500
    3. 400  Nisha   Manager    Marketing   $9,500

grep -v、-e、-E的更多相关文章

  1. linux删除空行操作:awk、grep、tr、sed

    如下:如何删除空行 shen\nshen\\n sen seh sehe she she 真正删除空行,可以使用vim: 通过命令模式删除空行.vim在命令模式下(在vim里输入英文字符:进入命令模式 ...

  2. [转帖]grep -v、-e、-E

    grep -v.-e.-E 转帖: https://www.cnblogs.com/franjia/p/4384362.html 发现 一些工具虽然一直在用 但是知道的还是少 哎. 概述 在Linux ...

  3. linux 搜索文件内容并输出命令 grep、-i、-v ^#

    grep /bin/grepgrep -iv [指定字条串] [文件]在文件中搜索字符串匹配的行并输出-i 不区分大小写 -v 排除指定字符串 grep -i java /etc/profile gr ...

  4. Linux下的五个查找命令:grep、find、locate、whereis、which

    原文转自 http://www.cnblogs.com/wanqieddy/archive/2011/07/15/2107071.html 1.grep grep(General Regular Ex ...

  5. Linux3:more、which、find、chmod、tar、diff、grep、ps、netstat、uname

    more 类似cat,不过more不是将整个文件内容从上到下显示在屏幕上的,而是以一页一页的显示方便使用者逐页阅读.more最基本的指令就是space即往下翻一页,b即往回翻一页显示,而且还有搜索字符 ...

  6. 正则表达式、find、grep、awk、sed

    1.正则表达式    (1)正则表达式一般用来描述文本模式的特殊用法,由普通字符(例如字符a-z)以及特殊字符(称为元字符,如/.*.?等)组成.   (2)基本元字符集及其含义       ^ :只 ...

  7. grep、sed、awk、perl、js、vim等对正则表达式的支持的差别

    grep.sed.awk.perl等对正则表达式的支持的差别 grep 2.5.1 egrep 2.5.1 sed 3.02 sed 4.07 awk 3.1.1 perl 5.8.0 vim 6.1 ...

  8. grep、egrep、fgrep的用法与特性详解

    [转载自]http://tanxw.blog.51cto.com/4309543/1361993 开篇        学习Linux也有一段时间了,对Linux多少也算是有点了解了,越是了解也就越对这 ...

  9. Linux进阶命令-sort、uniq、 cut、sed、grep、find、awk

    命令难度总体来说有简入难,参数都是工作中常常用到的.如果涉及到一些生僻的参数还请百度或man一下. sort(参考学习网站:http://www.cnblogs.com/dong008259/arch ...

随机推荐

  1. Solr04 - 在Jetty和Tomcat上部署Solr单机服务

    目录 1 准备安装环境 2 通过内部Jetty服务器启动 3 通过配置Tomcat服务器启动 3.1 删除不需要的应用 3.2 修改服务端口 3.3 部署solr.war 3.4 扩展: 虚拟目录发布 ...

  2. SQL Sever 2008 R2版本添加Northwin数据库错误解决

    一.环境: OS: Windows 7 ProfessionalSQL Server 2008 R2 二.示例数据库Northwind下载(mdf) Northwind 三.附加数据库: 打开Micr ...

  3. ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段

      ServletRequest 基本概念 JavaWeb中的 "Request"对象  实际为   HttpServletRequest  或者  ServletRequest, ...

  4. .NetCore2.1 WebAPI 根据swagger.json自动生成客户端代码

    前言 上一篇博客中我们可以得知通过Swagger插件可以很方便的提供给接口开发者在线调试,但是实际上Swagger附带的功能还有很多, 比如使用NSwag生成客户端调用代码,进一步解放接口开发者. N ...

  5. 解读经典《C#高级编程》泛型 页122-127.章4

    前言 本篇继续讲解泛型.上一篇讲解了泛型类的创建.本篇讲解泛型类创建和使用的细节. 泛型类 上篇举了个我产品中用到的例子,本篇的功能可以对照着此案例进行理解. /// <summary> ...

  6. Linux学习笔记之Django项目部署(CentOS)----进阶篇

    一.引入 当我们开发好了一个Django项目之后是需要部署到服务器上的,这样才能正式使用这个项目.之前用了一个运行.sh文件的方法让项目得以在后台运行,其实随着学习的深入,这种方法其实是有点low的, ...

  7. PHP中的Traits用法详解

    PHP是单继承的语言,在PHP 5.4 Traits出现之前,PHP的类无法同时从两个基类继承属性或方法.php的Traits和Go语言的组合功能有点类似, 通过在类中使用use关键字声明要组合的Tr ...

  8. windows安装elasticsearch

    1. 去官网 https://www.elastic.co/cn/ 下载 注意: ES对JDK版本有较高的要求,5.x及以上版本需要JDK8支持,本人此次使用2.4.6版本2. 下载后,JDK先安装, ...

  9. 关于guns开源框架单元测试问题

    首先在test文件夹里面删除红框里面的两个文件 然后再在需要测试的类里面右键类名生成测试文件 生成的测试文件加上这两句话 @RunWith(SpringJUnit4ClassRunner.class) ...

  10. sublime前端必备插件

    1,docblockr     javascr 和 CSS快捷注释插件 在javascript中  写出函数后,/**+回车 就会出现下面函数注释补全. -----/** * @param {[typ ...