1 简介


grep的基本命令格式如下:
          grep [options] [regexp] [filename]
 
如果regexp中含有空格,应该使用单引号或双引号括起来。单引号和双引号的区别在于在双引号中可以使用SHELL变量。
 
有很多不同风格的正则表达式,但实际上它们都非常相近,下面介绍grep中使用的正则表达式。
表1 正则表达式元字符
元字符 元字符名称 匹配
匹配单个字符的元字符    
. Dot 任意一个字符
[...] Character class 方括号中列出的作意一个字符
[^...] Negated character class 任意一个方括号中没有列出的字符
\char Escape character 转义字符(The character after the slash literally.),用于查找元字符,比如要查找"$"符号,表达式为"\$"
匹配一个位置的元字符    
^ Caret 行首
$ Dollar sign 行尾
\< Backslash less-than 字首(Start of a word)
\> Backslash greater-than 字尾(End of a word)
量词    
? Question mark(extended regular expressions) 0个或1个
* Asterisk 0个或多个
+ Plus(extended regular expressions) 1个或多个
{N} Match exactly(extended regular expressions) 匹配N次
{N,} Match at least(extended regular expressions) 至少匹配N次
{min,max} Specified range(extended regular expressions) 匹配min到max次
其它    
| Alternation(extended regular expressions) Matches either expression given
- Dash 指出一个范围,如a-z
(...) Parentheses(extended regular expressions) Used to limit scope of alternation
\1,\2, ... Backreference Matches text previously matched within parentheses (e.g., first set, second set, etc.)
\b Word boundary Batches characters that typically mark the end of a word (e.g., space, period, etc.)
\B Backslash 同'\\'
\w Word character This is used to match any “word” character(i.e., any letter, number, and the underscore character)
\W Non-word character This matches any character that isn’t used in words (i.e., not a letter, number, or underscore)
\` Start of buffer Matches the start of a buffer sent to grep
\' End of buffer Matches the end of a buffer sent to grep
 
表2 POSIX定义的Character Class
定义 匹配的内容
[:alpha:] 字母,无论大小写
[:digit:] 数字
[:alnum:] 字母和数字
[:blank:] Space or tab characters(空格或制表)
[:xdigit:] 十六进制字符,包括数字、A-F和a-f
[:punct:] Any punctuation symbol(标点)
[:print:] 可打印字符(非控制字符)
[:space:] Any whitespace character
[:graph:] Exclude whitespace characters
[:upper:] 大写字母
[:lower:] 小写字母
[:cntrl:] 控制字符
 
正则表达式可以使用和C字符串常量一样的连接方式。下面是一个例子:
     'username:' `whoami` ' and home directory is ' "$HOME"
如果当前用户为sw,则上面的表达式匹配"username:sw and home directory is /home/sw"。
 
grep由4个不同的程序组成,它们使用不同的表达式模型并且各有优缺点:
  • Basic Regular Expressions (grep or grep -G)
  • Extended Regular Expressions (egrep or grep -E)
  • Fixed Strings (fgrep or grep -F)
  • Perl-Style Regular Expressions (grep -P)
 
2 Basic Regular Expressions (grep or grep -G)

grep命令提供了很多选项用于控制匹配方式和输出方式,下面列出这些选项并做简短解释。

表3 grep命令选项
选项 示例 说明
Match Control    
-e pattern, --regexp=pattern grep -e -style doc.txt 把pattern当前正则表达式来解释。示例中如果不加-e,-style会被解释为命令选项。
-f file, --file=file grep -f pattern.txt searchhere.txt 从指定文件中读取正则表达式。The pattern file must list one pattern per line.
-i, --ignore-case grep -i 'help' me.txt 忽略大小写。
-v, --invert-match grep -v oranges filename 返回那些不匹配的行。
-w, --word-regexp grep -w 'xyz' filename 匹配单词。示例等同于grep "\bxyz\b" filename
-x, --line-regexp grep -x 'Hello, world!' filename 匹配整行。示例等同于grep '^Hello, world!$' filename
General Output Control    
-c, --count grep -c contact.html access.log 输出匹配的行数,而不是匹配的行的内容。
--color[=WHEN],
--colour[=WHEN]
rep --color[=auto] regexp filename 如果终端支持,grep将对输出内容着色,着色方式由环境变量GREP_COLORS定义。WHEN有3个合法值:never, always和auto。
-l, --files-with-matches grep -l "ERROR:" *.log 只输出含有匹配内容的文件名。使用lazy matching,找到第1个匹配的行以后停止在当前文件的匹配。
-L, --files-without-match grep -L 'ERROR:' *.log 只输出不含有匹配内容的文件名。使用lazy matching。
-m NUM, --max-count=NUM grep -m 10 'ERROR:' *.log 匹配NUM行以后停止在当前文件的匹配。
-o, --only-matching grep -o pattern filename 只输出匹配的内容而不是匹配的行。在二进制文件中查找某个串时很有用,因为如果输出行的话,输出内容中的二进制内容可能导致终端错误。
-q, --quiet, --silent grep -q pattern filename 不输出内容。可能通过检查grep命令的返回值来判断匹配的结果。0表示有内容匹配,1表示没有匹配到,2表示出错。
-s, --no-messages grep -s pattern filename 忽略由于文件不存在和权限原因导致的出错,不输出相应的错误信息。
Output Line Prefix Control    
-b, --byte-offset grep -b pattern filename 输出匹配内容在文件中的偏移量,从0开始。由于默认输出的是匹配的行,因此偏移量是行首在文件中的偏移量。和-o选项一起使用可以得到匹配内容的准确偏移量。这个选项在进行二进制文件分析时有用。
-H, --with-filename grep -H pattern filename 输出文件名。在多个文件中搜索时这是默认设置。要注意文件名是相对路径。
-h, --no-filename grep -h pattern * 不输出文件名。
--label=LABEL gzip -cd file.gz | grep --label=LABEL pattern 将来自标准输入的内容视为来自文件LABEL,因此输出时如果显示文件名则显示为LABEL。
-n, --line-number grep -n pattern filename 显示匹配的行在文件中的行号,行号从1开始。
-T, --initial-tab grep -T pattern filename 在grep产生的前缀和匹配的内容之间添加一个TAB进行分隔。
-u, --unix-byte-offsets grep -u -b pattern filename 使用Unix方式计算偏移量,这将忽略Windows上常用的CR字符。
-Z, --null grep -Z pattern filename 在输出的文件名后面打印ASCII NULL字符而不是通常紧跟在文件名后的字符(比如使用-l选项时文件名后面默认会打印一个换行符),这有利于在脚本里面对包含特定串的文件进行处理。
Context Line Control    
-A NUM, --after-context=NUM grep -A 3 Copyright filename 除匹配行外,打印出匹配行后面的NUM行,每一组之间用"--"分隔。
-B NUM, --before-context=NUM grep -B 3 Copyright filename 打印出匹配行前面的NUM行。
-C NUM, -NUM, --context=NUM grep -C 3 Copyright filename 打印出匹配行前后的NUM行,与同时使用-A和-B选项效果相同。
File and Directory Selection    
-a, --text grep -a pattern filename 与选项 --binary-files=text相同,把一个二进制文件当作为文本文件进行处理。
--binary-files=TYPE grep --binary-files=TYPE pattern filename TYPE可以是binary, without-match或者text。默认情况下grep如果处理一个二进制文件并且包含指定的表达式,只会显示类似“Binary file somefile.bin matches”的信息,不会显示匹配的行。这与--binary-files=binary的行为相同。如何TYPE为without-match,则grep直接跳过二进制文件,不对其做任何处理。
-D ACTION, --devices=ACTION grep -D read 123-45-6789 /dev/hda1 如果输入文件是一个特殊文件如FIFO或套接字,-D选项指定grep如何对其进行操作。当ACTION为skip时,grep直接跳过相应文件;为read时,grep将从中读取内容就如同处理普通文件一样。
-d ACTION, --directories=ACTION grep -d ACTION pattern path 如果输入文件是一个目录,-d选项指定grep将如何对其进行操作。当ACTION为skip时,grep忽略相应文件;为read时,grep将其当作普通文件读取其内容;为recurse时,grep递归地处理其中的文件,与“-R”的行为相同。
--exclude=GLOB grep --exclude=PATTERN path 排除文件名匹配PATTERN的文件,可以使用SHELL通配符。
--exclude-from=FILE grep --exclude-from=FILE path 与--exclude效果相同,不同的是从文件FILE中读取PATTERN。文件中每行一个PATTERN。
--exclude-dir=DIR grep --exclude-dir=DIR pattern path 与--exclude效果相似,不同的是此选项作用于目录。
-I grep -I pattern filename 与 --binary-files=without-match效果相同。
--include=GLOB grep --include=*.log pattern filename 只处理文件名匹配GLOB的文件。
-R, -r, --recursive grep -R pattern path
grep -r pattern path
递归处理指定路径中的所有文件。
Other Options    
--mmap grep --mmap pattern filename 使用mmap()替代read(),可以提高性能。但是如果在处理的过程中文件发生收缩(shrink),则会导致错误。
-V, --version   显示grep的版本信息。
-z, --null-data grep -z pattern 将输入的内容视为以ASCII NULL字符结尾,而不是换行符。与-Z选项,不过是作用于输入而不是输出。
 
grep不能使用扩展的元字符的功能,包括?, +, {n,m}, |, (). 如果要在grep中获得这些元字符提供的功能,需要在前面加上"\"转义符,如grep 'behaviou\?r', 与egrep 'behaviou?r'相同。在这种情况下,转义字符的意义和通常的“转义”相反,容易混淆,最好直接使用egrep或grep -E。
 
3 Extended Regular Expressions (egrep or grep -E)

grep -E具有和grep相同的命令行选项,只是增加了一些元字符以创建更复杂和精确的表达式。grep -E支持以下grep不支持的元字符:?, +, {n,m}, |, ().
 
表4 Extended Regular Expressions支持的元字符
元字符 意义 示例
? 表示可选,即出现0次或1次 egrep 'behaviou?r' filename                   匹配behavior和behaviour
+ 表示出现1次或多次 egrep 'pattern1+' filename                    匹配pattern1, pattern11, pattern111....
{n,m} 表示至少出现n次,最多出现m次 egrep 'pattern{4}' filename                   匹配patternnnn
egrep 'pattern{4,}' filename                  n至少出现4次
egrep 'pattern{,4}' filename                  这种形式是错误的,不提供”最多出现X次”的语义
egrep 'pattern{4,6}' filename                n出现4次到6次
| 表示“或” egrep 'name1|name2' filename             匹配name1或者name2
( ) 将模式串分组(group)以便backreferences, alternation或者仅仅是为了提高可读性。
加上括号可以使得模式更准确和易理解,括号中的模式通常称为子模式(subpattern)。
括号还用于限制"|"元字符作用的边界。
egrep 'patt(a|e)rn' filename                  匹配pattarn或pattern
 
如果要使用egrep匹配字符'{',需要使用'[{]'进行转义,而不是'\{'。
 
4 Fixed Strings (fgrep or grep -F)

fgrep也被称为fast grep,因为它不使用正则表达式。使用方式:
     fgrep string_pattern filename
 
表5 fgrep支持的选项
选项 示例 说明
-b fgrep -b string_pattern filename 输出匹配的行的行首在文件中的偏移量
-c fgrep -c string_pattern filename 输出匹配的行数
-e, -string fgrep -e string_pattern1 -e string_pattern2 filename 将-e后面的串当作patter,用于指定多个模式,或者用于以'-'字符开头的模式
-h fgrep -h string_pattern filename 在多个文件中搜索时,结果不输出文件名
-i fgrep -i string_pattern filename 不区分大小写
-l fgrep -l string_pattern filename 输出匹配的文件名,但不输出匹配的行
-n fgrep -n string_pattern filename 输出行号,从1开始
-v fgrep -v string_pattern filename 输出不匹配的行
 
5 Perl-Style Regular Expressions (grep -P)

grep -P使用Perl-Compatible Regular Expressions (PCRE) library来解析正则表达式,Perl正则表达式擅长处理文本,但是也非常复杂,容易出错。grep -P的行为与系统中libpcre库和Perl的版本有关。另外,也不是所有版本的grep都支持-P选项。Red Hat系的系统一般都支持,而Debian默认不支持,但是会提供一个pcregrep来替代grep -P。
 
与grep -E和grep -F不同,grep -P没有pgrep命令。pgrep是用来查找系统中运行进程的命令。
 
所有grep的选项都可以用于grep -P,只是正则表达式的处理方式不同。
 
PCRE比较繁杂的样子,此处略。
 
6 grep相关的环境变量

grep的行为与系统的locale相关变量设置有关。通常情况下系统默认的locale设置就ok。
 
可以通过GREP_OPTIONS变量设置grep的默认行为。GREP_OPTIONS包含grep的命令行选项,因此要注意这些选项是不能被后续的命令行选项覆盖的,如果后续的命令行选项与GREP_OPTIONS中的冲突,则grep报错。
 
通过指定GREP_COLORS选项定制grep的输出配色方案。

 
7 grep的高级用法

使用alternation和backreference会导致性能低下,尤其是backreference可能导致grep所需时间呈指数级增长。
 
使用strings命令可以列出一个二进制文件中所有的字符串,如strings /bin/ls
 

grep Pocket Reference读记的更多相关文章

  1. 《阿里巴巴Java开发手册(正式版》读记

    前几天,阿里巴巴发布了<阿里巴巴Java开发手册(正式版>,第一时间下载阅读了一番. 不同于一般大厂内部的代码规范,阿里巴巴的这本Java开发手册,可谓包罗万象,几乎日常Java开发中方方 ...

  2. (转) [it-ebooks]电子书列表

    [it-ebooks]电子书列表   [2014]: Learning Objective-C by Developing iPhone Games || Leverage Xcode and Obj ...

  3. Oracle DBA 的常用Unix参考手册(一)

    作为一名Oracle DBA,在所难免要接触Unix,但是Unix本身又是极其复杂的,想要深刻掌握同样很不容易.那么到底我们该怎么入手呢?Donald K Burleson 的<Unix for ...

  4. 3000本IT书籍下载地址

    http://www.shouce.ren/post/d/id/112300    黑客攻防实战入门与提高.pdfhttp://www.shouce.ren/post/d/id/112299    黑 ...

  5. [转载]生活在 Emacs 中

    Brian Bilbrey2002 年 8 月 20 日发布 教程简介 本教程讲什么? Emacs 是一个流行的无模式文本编辑器,有许多强大的功能.本教程将教您使用 Emacs 的基础知识.为了让您很 ...

  6. [Python] 学习资料汇总

    Python是一种面向对象的解释性的计算机程序设计语言,也是一种功能强大且完善的通用型语言,已经有十多年的发展历史,成熟且稳定.Python 具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用 ...

  7. 推荐一些不错的计算机书籍(php c mysql linux等等)

    推荐一些不错的计算机书籍. # PHP<PHP程序设计>(第2版)  --PHP语法和入门最好的书<PHP5权威编程>  --PHP入门后升级书<深入PHP:面向对象.模 ...

  8. Head First Html and CSS学习笔记之CSS

    第七章 CSS入门 元素的许多属性都可以设置样式,太多了,记不住,可以参考<CSS Pocket Reference>. 外部样式表,<link type = "text/ ...

  9. Linux系统信息查看命令大全

    系统# uname -a # 查看内核/操作系统/CPU信息# head -n 1 /etc/issue # 查看操作系统版本# cat /proc/cpuinfo # 查看CPU信息# hostna ...

随机推荐

  1. (转)@ContextConfiguration注解说明

    场景:学习spring实战中相关的单元测试 1 正常使用 @ContextConfiguration Spring整合JUnit4测试时,使用注解引入多个配置文件 1.1 单个文件 @ContextC ...

  2. hibernate 使用枚举字段的最佳实践

    枚举类虽然很简单,但是却往往是系统中业务逻辑最集中最复杂的地方.本文将会分享我们项目中基于hibernate的枚举类使用规范,包含数据库中枚举列数据类型.注释.枚举列与枚举类的映射等. 一.枚举类定义 ...

  3. 坏块管理(Bad Block Management,BBM)

    看了很多坏块管理的文章,加上自己的理解,把整个坏块管理做了个总结. 坏块分类 1.出厂坏块 又叫初始坏块,厂商会给点最小有效块值(NVB,mininum number of valid blocks) ...

  4. 网络爬虫Web开始

    一.介绍 该程序主体是<Python核心编程第二版>例20.2.本篇会修改部分代码及添加了相关注释. ps:该书该例程不能直接运行,需要修改. 二.功能 网络爬虫crawl.py抓取web ...

  5. 编写一个矩形类,私有数据成员为矩形的长( len)和宽(wid),wid设置为0,有参构造函数设置和的值,另外,类还包括矩形的周长、求面积、取矩形的长度、取矩形的长度、取矩形的宽度、修改矩形的长度和宽度为对应的形参值等公用方法。

    class Rectangle { private double len, wid; public Rectangle()//求矩形周长 { len = 0; wid = 0; } public Re ...

  6. NYOJ--86--set.find()--找球号(一)

    /* Name: NYOJ--86--找球号(一) Date: 20/04/17 14:45 Description: 理想很美好,现实很残酷,准备用字符串水过,结果TLE了 ╮(╯▽╰)╭ */ # ...

  7. 个人php开发之工具--sublime主题配置(二)

    摘要:俗话说:工欲善其事,必先利其器.作为一名开发者来说,熟练的使用工具可以达到事半功倍的效果,我就我自己使用的工具说自己的看法.当然,每个人对某个软件都有自己的看法或使用经验,还是那句老话,什么是最 ...

  8. 前端到后台ThinkPHP开发整站(7)

    今晚我继续这个项目的前台开发,把前台的做出来了,现在项目进行一个收尾工作了,还有栏目页和一个文章页的开发,做完这两个算是完成了.说到这里感觉有点松懈了,把剩下两个功能页面做完在吹吧,先看看今天弄的代码 ...

  9. SNS社交系统“ThinkSNS V4.6”活动应用功能详解及应用场景举例

    sns社交系统ThinkSNS目前拥有功能:朋友圈(微博).微吧(论坛).频道.积分商城.IM即时聊天.直播.问答.活动.资讯(CMS).商城.广场.找人.搜索.评论.点赞.转发.分享.话题.积分.充 ...

  10. Linux下使Shell 命令脱离终端在后台运行

    --Linux下使Shell 命令脱离终端在后台运行------------------------------------2014/02/14你是否遇到过这样的情况:从终端软件登录远程的Linux主 ...