本文转载自:如何使用Unix/Linux grep命令——磨刀不误砍柴工系列。该博文条理很清晰。

grep简介

  grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印出来,不会修改原文件内容。使用grep 命令的语法为:

$grep [option(s)] pattern [file(s)]

  其中option为grep命令的选项,pattern为要匹配的简单字符串或携带特殊字符的模式字符串,file为文件列表,可有多个文件。

grep中经常用到的选项

  -i 忽略pattern中的大小写

$grep -i hAL /etc/passwd

  -w 搜索整个词汇
  忽略大小写并搜索整个词汇"samba"

$grep -iw "samba" /tec/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:

  -r 递归地指定文件所在目录中的所有子目录中的文件
  -v 查找与pattern不匹配的行

  定义输出方式:
  -o 仅打印出匹配的一段,而非整行
  -n 打印出匹配行的行号
  -l 仅打印出匹配行所在的文件
  -c 打印出每个文件中匹配行的总数
  -A num 显示匹配行之后的num行
  -B num 显示匹配行之前的num行
  -C num 相当于 -A num 与 -B num 的组合
  --color=auto 将pattern在匹配行中高亮输出

  注意:
  1)选项区分大小写
  2)多个选项可以一起使用,例如:

$grep -iwr

  3)grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

在grep中使用正则表达式

基本的匹配模式

  尽管直接使用最简单直接的pattern字串可以完成一些重要任务,但是grep命令的真正威力在于它可以使用正则表达式来完成复杂的模式字串的匹配。grep命令中使用的是“基本的正则表达式”,如果想使用更高级的正则表达式规则,需要指定选项 -E ,相当于egrep命令。
  以下字符或字符串在正则表达式的规则中具有特殊意义,如,*,+,[,],^,$,\,{,}
  它们的多种组合展示了基本的正则表达式的匹配模式:
  1)'.'匹配任意单一字符
  2)X* 与包含连续0个或多个字符X的行匹配
  3)X\+ 与包含连续1个或多个字符X的行匹配
  4)[a-z] 与包含a-z的其中一个字符的行匹配
  5)[^a-z] 与不包含a-z的其中一个字符的行匹配
  6)[0-9] 与包含0-9的其中一个字符的行匹配
  7)^hello 与以字串hello起始的行匹配
  8)hello$ 与以字串hello结束的行匹配
  9)\ 转义字符,后跟特殊字符,可表示它本来的涵义
  10)
    \d 匹配一个数字字符,等价于 [0-9]
    \D 匹配一个非数字符,等价于 [^0-9]
    \w 等价于 "[A-Za-z0-9_]"
    \W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"
    \s 匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]
    \S 匹配任何非空白字符,等价于 [^\f\r\n\t\v]
    \b 匹配一个单词边界,也就是指单词和空格间的位置。
    \B 匹配非单词边界。
  如,

$grep '[' filename

  返回结果为grep : Invalid regular expression

  而,

$grep '\[' filename

  会匹配所有包含‘['(不包括单引号)的行。

  11)

    X\{n\} 与连续包含n个字符X的行匹配
    X\ {n,\} 与至少连续包含n个字符X的行匹配 (注意n后面的',')
    X\{,m\} 与最多连续包含m个字符X的行匹配 (注意m前面的',')
    X\{n,m\} 与最少包含n个,最多包含m个字符X的行匹配

  注意:
  不要混淆shell 中的"."、"*"与正则表达式中的"."、"*",很多刚开始学的人都会犯错。
  在正则表达式中,"."很像shell中的"?",它与任意单一字符匹配。而"*"在正则表达式中的使用,表示"*"前面的字符可能出现0次或1次或多次,与shell中的"*"涵义不同。  

grep中模式操作(与或非)

  1)grep OR 操作(4 种方法)

  A. 使用 \|

$grep 'pattern1\|pattern2' filename 

  B. 使用 -E 选项

  grep -E 代表扩展的正则表达式. 若使用-E选项,则可以去掉转义字符'\',直接使用'|'

$grep -E 'pattern1|pattern2' filename

  C. 使用 egrep 命令

  egrep 相当于 ‘grep -E’.

  D. 使用 -e 选项

  通过指定多个-e选项来应用多个pattern,多个pattern之间是“或”的关系

$grep -e pattern1 -e pattern2 filename

  2)grep AND 操作

  A. 使用 -E选项和模式字符 'pattern1.*pattern2'

$grep -E 'pattern1.*pattern2' filename

  以上命令为在filename文件中查找既与pattern1匹配又与pattern2匹配的行

$grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename

  B. 利用管道实现

$grep -E 'pattern1' filename | grep -E 'pattern2'

  3)grep NOT 操作

  A. 使用 -v 选项

$grep -v 'pattern' filename 

  以上命令在filename文件中查找不能与pattern匹配的行

示例

  1)对文件中的空行计数

$grep -c "^$" filename 

  2)查找在“hello”有任意长度字串的行

$grep ".*hello" filename 

  3)查找在'hi'与'hello'之间至少有一个空格的行

$grep "hi \+hello" filename

  4)查找在'hi'与'hello'之间没有空格或有多个空格的行

$grep "hi *hello" filename 

  5)查找在'hi'与'hello'之间没有空格或有1个空格的行

$grep "hi \?hello" filename 

  6)查找ip地址127.0.0.1 (其中包含特殊字符 '.')

$grep "127\.0\.0\.1" filename

  7)过滤其他命令的输出结果

$ls --help | grep "dired"

  将ls命令的帮助文本,作为grep的输入,查找与"dired"匹配的行
  输出为:-D, --dired generate output designed for Emacs' dired mode
  8)从系统日志中获得有用的信息
  在apache日志文件中查找以IP地址开头,包含数字200的行

$grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200" /srv/www/example.com/logs/access.log

Unix/Linux中的grep命令(转)的更多相关文章

  1. Linux中通过grep命令检索文件内容和指定内容前后几行

    原文链接: https://www.linuxidc.com/Linux/2017-11/148390.htm Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命 ...

  2. Linux中利用grep命令如何检索文件内容详解

    前言 Linux系统中搜索.查找文件中的内容,一般最常用的是grep命令,另外还有egrep命令,同时vi命令也支持文件内容检索.下面来一起看看Linux利用grep命令检索文件内容的详细介绍. 方法 ...

  3. Linux 中的 grep 命令

    一,grep命令有什么用 个人觉得grep命令就是一个对文本或输出进行匹配并控制输出的一个工具,看一下下面的参数,部分翻译了,有不对的地方,还请指正: grep --help 匹配模式选择: -E,  ...

  4. Linux 中的grep命令单引号,不加任何参数以及双引号的作用

    单引号: 可以说是所见即所得:即将单引号内的内容原样输出,或者描述为单引号里面看到的是什么就会输出什么.单引号''是全引用,被单引号括起的内容不管是常量还是变量者不会发生替换. 双引号: 把双引号内的 ...

  5. linux中的grep命令用法

    原文请移驾:http://blog.csdn.net/greytree/article/details/428532 grep -- print lines matching a pattern (将 ...

  6. Linux中的grep 命令

    介绍grep文本处理命令,它也可以解释正则. 常用选项: -E :开启扩展(Extend)的正则表达式. -i :忽略大小写(ignore case). -v :反过来(invert),只打印没有匹配 ...

  7. Linux中的grep命令

    grep - print lines matching a pattern 参数: -a 将binary文件以text文件的方式查找 -i 忽略大小写 --color=zuto 加颜色匹配字符串 -v ...

  8. linux中的strings命令简介2

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 之前我们聊过linux strings的用法和用 ...

  9. linux中的strings命令简介

    摘自:http://blog.csdn.net/stpeace/article/details/46641069 linux中的strings命令简介 在linux下搞软件开发的朋友, 几乎没有不知道 ...

随机推荐

  1. Web自动化框架LazyUI使用手册(3)--单个xpath抓取插件详解(selenium元素抓取,有此插件,便再无所求!)

    概述 前面的一篇博文粗略介绍了基于lazyUI的第一个demo,本文将详细描述此工具的设计和使用. 元素获取插件:LazyUI Elements Extractor,作为Chrome插件,用于抓取页面 ...

  2. 多线程(三) 实现线程范围内模块之间共享数据及线程间数据独立(ThreadLocal)

    ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.JDK 1.2的版本中就提供java.lang.ThreadLocal,使用这个工具类可以很简洁地编写出优美的多线程程序,Threa ...

  3. Java并发框架——AQS之如何使用AQS构建同步器

    AQS的设计思想是通过继承的方式提供一个模板让大家可以很容易根据不同场景实现一个富有个性化的同步器.同步器的核心是要管理一个共享状态,通过对状态的控制即可以实现不同的锁机制.AQS的设计必须考虑把复杂 ...

  4. HDFS:NameNode、DataNode、SecondaryNameNode

    可以一句话描述 HDFS:把客户端的大文件存放在很多节点的数据块中. HDFS设计原则: 1,文件以块(block)方式存储: 2,通过副本机制提高可靠度和读取吞吐量: 3,每个区块至少分到三台Dat ...

  5. Java基本语法-----java进制的转换

    进制: 进制是一种记数方式 ,可以用有限的数字符号代表所有的数值.由特定的数值组成. 1整型的表现形式 1.十进制: 都是以0-9这九个数字组成,不能以0开头. 2.二进制: 由0和1两个数字组成. ...

  6. 【JavaEE WEB 开发】Tomcat 详解 Servlet 入门

    转载请注明出处 :  http://blog.csdn.net/shulianghan/article/details/47146817 一. Tomcat 下载安装配置 1. Tomcat 下载 T ...

  7. 内存管理单元--MMU

    现代操作系统普遍采用虚拟内存管理(Virtual Memory Management)机制,这需要处理器中的MMU(Memory Management Unit,内存管理单元)提供支持,本节简要介绍M ...

  8. Android 自定义View-android学习之旅(十四)

    自定义View的步骤 当andoid提供的系统组件不满足要求时候,完全可以集成View来派生自定义组件. 首定定义一个继承View的子类,然后重写他一个或几个方法. 重写的方法介绍 构造器:这是定制V ...

  9. android最新更新方法

    使用SDK Manager更新时出现问题Failed to fetch URL https://dl-ssl.google.com/android/repository/repository-6.xm ...

  10. linux qcom LCD framwork

    点击打开链接 0.关键字 MDSS : Multimedia Display sub system DSI: Display Serial Interface 1.涉及文件 (1) drivers\v ...