grep 参数

来源:互联网 发布:大数据相关专业 编辑:程序博客网 时间:2024/05/21 10:29
  http://future.blog.51cto.com/26959/88653
一、grep 参数使用
Gun grep   选项
-b   在搜索到的行的前面打印该行所在的块号码。
-c   只显示有多少行匹配 ,而不具体显示匹配的行
-h   不显示文件名
-i    在字符串比较的时候忽略大小写
-l    只显示包含匹配模板的行的文件名清单,不同项目之间用换行符分隔
-L   打印不匹配模板的文件名清单
-n   在每一行前面打印该行在文件中的行数
-s   静默工作,除非出现错误信息否则不打印任何信息,这个功能在检测退出状态的时候有用
-v   反检索,只显示不匹配的行
-w 
-Ax  在匹配指定行打印完毕后,再打印x行(向原文件匹配行下x行)
-By  在匹配指定行前面打印y行(在原文件匹配行上面打印y行)
-Cz  在匹配行前后打印z行  (在原文件匹配行上下打印z行)
-b    在每一行前面打印字符偏移量
-f  file   从文件file中提取模板。空文件中包含0个模板
-q     取消标准输出,跟-n功能是一样的
-s     不显示关于不存在或者无法读文件的错误信息
-w   只打印以单词形式匹配模板的行,模板可以是包含数字、字符和下划线的字符串
-x    只打印整行匹配的行
-y   用法同-i
-U  把文件作为二进制文件,这个选项只在MS-DOS和MS-Windows中被支持(这个参数没有明白,请过路高人指点,非常感谢)
-u 按照unix风格报告字符偏移量。只在-b选项同时被使用的时候才有效。这个选项只在MS-DOS和MS-Windows中被支持
 
grep "$name" file  把变量$name 的值作为模板,在文件中寻找匹配模板的行。注意,必须使用双引号
 
重复作用的元字符, \{\}; 用来做标签的元字符,\(\); 用来锚定单词的元字符\<\>

***********************************************************************************************************************************************************************************
功能:查找文件里符合条件的字符串。

语法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>][-d<进行动作>][-e<范本样式>][-f<范本文件>][--help][范本样式][文件或目录...]

补充说明:grep指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设grep指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为“-”,则grep指令会从标准输入设备读取数据。

参数
  -a或--text   不要忽略二进制的数据。
  -A<显示列数>或--after-context=<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之后的内容。
  -b或--byte-offset   在显示符合范本样式的那一列之前,标示出该列第一个字符的位编号。
  -B<显示列数>或--before-context=<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之前的内容。
  -c或--count   计算符合范本样式的列数。
  -C<显示列数>或--context=<显示列数>或-<显示列数>   除了显示符合范本样式的那一列之外,并显示该列之前后的内容。
  -d<进行动作>或--directories=<进行动作>   当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
  -e<范本样式>或--regexp=<范本样式>   指定字符串做为查找文件内容的范本样式。
  -E或--extended-regexp   将范本样式为延伸的普通表示法来使用。
  -f<范本文件>或--file=<范本文件>   指定范本文件,其内容含有一个或多个范本样式,让grep查找符合范本条件的文件内容,格式为每列一个范本样式。
  -F或--fixed-regexp   将范本样式视为固定字符串的列表。
  -G或--basic-regexp   将范本样式视为普通的表示法来使用。
  -h或--no-filename   在显示符合范本样式的那一列之前,不标示该列所属的文件名称。
  -H或--with-filename   在显示符合范本样式的那一列之前,表示该列所属的文件名称。
  -i或--ignore-case   忽略字符大小写的差别。
  -l或--file-with-matches   列出文件内容符合指定的范本样式的文件名称。
  -L或--files-without-match   列出文件内容不符合指定的范本样式的文件名称。
  -n或--line-number   在显示符合范本样式的那一列之前,标示出该列的列数编号。
  -q或--quiet或--silent   不显示任何信息。
  -r或--recursive   此参数的效果和指定“-d recurse”参数相同。
  -s或--no-messages   不显示错误信息。
  -v或--revert-match   反转查找。
  -V或--version   显示版本信息。
  -w或--word-regexp   只显示全字符合的列。
  -x或--line-regexp   只显示全列符合的列。
  -y   此参数的效果和指定“-i”参数相同。
  --help   在线帮助。
Grep实例
相信grep是UNIX和LINUX中使用最广泛的命令之一。grep(全局正则表达式版本)允许对文本文件进行模式查找。如果找到匹配模式,grep打印包含模式的所有行。grep支持基本正则表达式,也支持其扩展集。grep有三种变形,即:
  grep:标准grep命令,本章大部分篇幅集中讨论此格式。
  egrep:扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用,与之相对应的一些更加规范的模式,这里也不予讨论。
  fgrep:快速grep。允许查找字符串而不是一个模式。不要误解单词fast,实际上它与grep速度相当。
  在本章中我们将讨论:
  ? grep(参数)选项。
  ? 匹配grep的一般模式。
  ? 只匹配字母或数字,或两者混用。
  ? 匹配字符串范围。
实际上应该只有一个grep命令,但不幸的是没有一种简单形式能够统一处理grep的三种变形,将之合而为一,并保持grep单模式处理时的速度。GNUgrep虽然在融合三种变形上迈进了一大步,但仍不能区分元字符的基本集和扩展集。上一章只讨论了基本的正则表达式,但在查看grep时也涉及到一些扩展模式的匹配操作。然而,首先还是先讨论一下在grep和fgrep及egrep中均可使用的grep模式吧。
  开始讨论之前,先生成一个文件,插入一段文本,并在每列后加入<Tab>键,grep命令示例中绝大多数将以此为例,其命名为data.f。生成一个文件,但不知其含义,将是一件很枯燥的事。那么先来看看data.f的记录结构。
  第1列:城市位置编号。
  第2列:月份。
  第3列:存储代码及出库年份。
  第4列:产品代号。
  第5列:产品统一标价。
  第6列:标识号。
  第7列:合格数量。
  $ less data.f
  48    Dec         3BC1997        LPSX      68.00      LVX2A    138
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  47    Oct         3ZL1998        LPSX      43.00      KVM9D  512
  219  dec         2CC1999        CAD       23.00      PLV2C    68
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  483  may        5PA1998        USP        37.00      KVM9D  644
  216  sept        3ZL1998        USP        86.00      KVM9E   234

  
  8.1 grep

  grep一般格式为:
  grep [选项]基本正则表达式[文件]
  这里基本正则表达式可为字符串。
  
  8.1.1
 双引号引用
在grep命令中输入字符串参数时,最好将其用双引号括起来。例如:“mystring”。这样做有两个原因,一是以防被误解为shell命令,二是可以用来查找多个单词组成的字符串,例如:“jetplane”,如果不用双引号将其括起来,那么单词plane将被误认为是一个文件,查询结果将返回“文件不存在”的错误信息。
  在调用变量时,也应该使用双引号,诸如:grep“$MYVAR”文件名,如果不这样,将没有返回结果。
  在调用模式匹配时,应使用单引号。
  
  8.1.2 grep选项 

  常用的grep选项有:
  -c 只输出匹配行的计数。
  -i 不区分大小写(只适用于单字符)。
  -h 查询多文件时不显示文件名。
  -l 查询多文件时只输出包含匹配字符的文件名。
  -n 显示匹配行及行号。
  -s 不显示不存在或无匹配文本的错误信息。
  -v 显示不包含匹配文本的所有行。
  
  8.1.3
 查询多个文件
  如果要在当前目录下所有.doc文件中查找字符串“sort”,方法如下:
  $ grep "sort"*.doc
  或在所有文件中查询单词“sort  it”
  $ grep "sort it" *
  现在讲述在文本文件中grep选项的用法。
  
  8.1.4
 行匹配
  $ grep -c "48"data.f
   4

  grep返回数字4,意义是有4行包含字符串“48”。
  现在显示包含“48”字符串的4行文本:
  $ grep “48” data.f
  48    Dec         3BC1997        LPSX      68.00      LVX2A    138
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  483  may        5PA1998        USP        37.00      KVM9D  644

  
  8.1.5
 行数
  显示满足匹配模式的所有行行数:
  $ grep -n “48” data.f
  1:48        Dec        3BC1997        LPSX      68.00      LVX2A   138
  2:483      Sept        5AP1996        USP        65.00      LVX2C    189
  5:484      nov         7PL1996        CAD       49.00      PLV2C    234
  6:483      may        5PA1998        USP        37.00      KVM9D  644
  
行数在输出第一列,后跟包含48的每一匹配行。
  
  8.1.6
 显示非匹配行
  显示所有不包含48的各行:
  $ grep -v “48” data.f
  219  dec         2CC1999        CAD       23.00      PLV2C    68
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  216  sept        3ZL1998        USP        86.00      KVM9E   234

  8.1.7 精确匹配
  可能大家已注意到,在上一例中,抽取字符串“48”,返回结果包含诸如484和483等包含“48”的其他字符串,实际上应精确抽取只包含4 8的各行。注意在每个匹配模式中抽取字符串后有一个<Tab>键,所以应操作如下:
  $ grep “48<tab>” data.f
  48    Dec         3BC1997        LPSX      68.00      LVX2A    138
  
<Tab>表示点击tab键。
  使用g r e p抽取精确匹配的一种更有效方式是在抽取字符串后加\ >。假定现在精确抽取48,方法如下:
  $ grep ‘48\>’ data.f
  48    Dec         3BC1997        LPSX      68.00      LVX2A    138

  8.1.8 大小写敏感
  缺省情况下,grep是大小写敏感的,如要查询大小写不敏感字符串,必须使用- i开关。在data.f文件中有月份字符Sept,既有大写也有小写,要取得此字符串大小写不敏感查询,方法如下:
  $ grep -i “sept” data.f
  483  may        5PA1998        USP        37.00      KVM9D  644
  216  sept        3ZL1998        USP        86.00      KVM9E   234

  8.2 grep和正则表达式 
  使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止grep中使用的专有模式与一些shell命令的特殊方式相混淆。
  
  8.2.1
 模式范围
  假定要抽取代码为484和483的城市位置,上一章中讲到可以使用[ ]来指定字符串范围,这里用48开始,以3或4结尾,这样抽出484或483。
  $ grep ‘48[34]’ data.f
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  483  may        5PA1998        USP        37.00      KVM9D  644

  8.2.2 不匹配行首
  如果要抽出记录,使其行首不是48,可以在方括号中使用^记号,表明查询在行首开始。
  $ grep ‘^[^48]’ data.f
  219  dec         2CC1999        CAD       23.00      PLV2C    68
  216  sept        3ZL1998        USP        86.00      KVM9E   234
  
  8.2.3
 设置大小写
  使用-i开关可以屏蔽月份Sept的大小写敏感,也可以用另一种方式。这里使用[ ]模式抽取各行包含Sept和sept的所有信息。
  $ grep ‘[Ss]ept’ data.f
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  216  sept        3ZL1998        USP        86.00      KVM9E   234
  
如果要抽取包含Sept的所有月份,不管其大小写,并且此行包含字符串483,可以使用管道命令,即符号“|”左边命令的输出作为“|”右边命令的输入。举例如下:
  $ grep ‘[Ss]ept’ data.f | grep 483
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  
不必将文件名放在第二个grep命令中,因为其输入信息来自于第一个grep命令的输出。
  
  8.2.4
 匹配任意字符
  如果抽取以L开头,以D结尾的所有代码,可使用下述方法,因为已知代码长度为5个字符:
  $ grep ‘K…D’ data.f
  47    Oct         3ZL1998        LPSX      43.00      KVM9D  512
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  
将上述代码做轻微改变,头两个是大写字母,中间两个任意,并以C结尾:
  $ grep ‘[A-Z][A-Z]..C’ data.f
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  219  dec         2CC1999        CAD       23.00      PLV2C    68
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  
  8.2.5
 日期查询
  一个常用的查询模式是日期查询。先查询所有以5开始以1996或1998结尾的所有记录。使用模式5..199[6,8]。这意味着第一个字符为5,后跟两个点,接着是199,剩余两个数字是6或8。
  $ grep ‘5..199[6,8]’ data.f
  483  may        5PA1998        USP        37.00      KVM9D  644
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  
查询包含1998的所有记录的另外一种方法是使用表达式[0-9]\{3\}[8],含义是任意数字重复3次,后跟数字8,虽然这个方法不像上一个方法那么精确,但也有一定作用。
  $ grep ‘[0-9]\{3\}[8]’ data.f
  47    Oct         3ZL1998        LPSX      43.00      KVM9D  512
  483  may        5PA1998        USP        37.00      KVM9D  644
  216  sept        3ZL1998        USP        86.00      KVM9E   234

  8.2.6 范围组合
  必须学会使用[ ]抽取信息。假定要取得城市代码,第一个字符为任意字符,第二个字符在
  0到5之间,第三个字符在0到6之间,使用下列模式即可实现。
  $ grep ‘[0-9][0-5][0-6]’ data.f
  48    Dec         3BC1997        LPSX      68.00      LVX2A    138
  483  Sept        5AP1996        USP        65.00      LVX2C    189
  47    Oct         3ZL1998        LPSX      43.00      KVM9D  512
  219  dec         2CC1999        CAD       23.00      PLV2C    68
  484  nov         7PL1996        CAD       49.00      PLV2C    234
  483  may        5PA1998        USP        37.00      KVM9D  644
  216  sept        3ZL1998        USP        86.00      KVM9E   234
  
这里返回很多信息,有想要的,也有不想要的。参照模式,返回结果是正确的,因此这
  里还需要细化模式,可以以行首开始,使用^符号:
  $ grep ‘^[0-9][0-5][0-6]’ data.f
  216  sept        3ZL1998        USP        86.00      KVM9E   234
  
这样可以返回一个预期的正确结果。
原创粉丝点击