`
jiagou
  • 浏览: 2525907 次
文章分类
社区版块
存档分类
最新评论

linux 命令之grep

 
阅读更多

1 引言

Grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Grep 家族包括Grep、 eGrep 和fGrep。eGrep 和fGrep 的命令只跟Grep 有很小不同。eGrep 是Grep 的扩展,支持更多的re 元字符, fGrep 就是 fixed Grep 或fast Grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux 使用GNU 版本的Grep。它功能更强,可以通过-G、-E、-F 命令行选项来使用eGrep 和fGrep 的功能。Grep 的工作方式是这样的,它在一个或多个文 中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。Grep 可用于shell 脚本,因为Grep 通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文 不存在,则返回2 。我们利用这些返回值就可进行一些自动化的文本处理工作。

2 Grep 详解

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

语  法: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 在线帮助。

3 grep 实战


开始实战,我是直接在linux text模式启动,你可以自己找到一个测试目录,第一步执行命令:上面这句命令的意思是:如果1.txt存在就打开,不存在就创建并打开
接着按一下键盘的s键,看见linux屏幕左下角提示“---插入---”,表明当前已经变成插入模式,接着,大家鼠标右键复制一下下面的这段文本,
在linux屏幕里点击鼠标右键,内容就粘帖进去了。
然后大家按一下键盘的“ESC”键,然后输入一个冒号”:“ 屏幕里出现冒号之后,输入:wq,提示已写入。并已退出vi编辑模式。
接着执行命令:复制一份1.txt命名为2.txt , 好了 ,练习开始。

p1:多文件查询
在1.txt和2.txt中查询出包含”区"的行:
或者查询出当前文件夹下的所有文件中包含“区” 的行:

p2:行匹配
查询1.txt中包含“区"关键字的总行数,我们可以使用-c来显示行数。

p3:显示行号
我们可以使用-n开关啦控制是否显示行号,这个行号是在文件里的实际的行号。


p5:精确匹配
我们可以使用\>符号来匹配以区结尾的字符串
我们可以使用\《符号来匹配以区开头的字符串,结果为空。
p6:大小写敏感
grep 默认是大小写敏感的,我们可以使用-i开关来控制,如果不加-i 结果为空:
[channel@localhost kingviker]$ grep -i 'beijing' 1.txt 
北京市 Beijingshi

正则表达式

使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止g r e p 中使用的专有模式与一些s h e l l 命令的特殊方式相混淆。

p1:范围模式
如果想要查询‘山东’和‘山西’的列表,可以用[ ]来指定范围。
如果想要查询”山“开头的省份,
grep  '^山' 1.txt 结果同上。
如果想查询非”山“开头的省份,

p3:大小写设置
上面提到过了 可以用-i开关控制,也可以用[]包含大小写来实现:
p4:匹配任意字符
我们还是查询以"山"开头的省份,我们如果想查询想查询,以“山,河,广'开头的省份,

p5:范围组合
我们想查询以大写字母A-L开头,中间可以出现0到6个小写字母,包含sh和Sh,并且以i或者eng结尾的结果:

p6:模式出现几率
上面的命令大家可能不懂”\{0,6\}“,现在就说明一下,这个是描述它前面的字母出现的次数,上例子中的意思就是a-z的字母可以连续出现0到6个。如果后边不写”\{1,\}"表示至少出现一次的,如果只写一个数字”\{2\}",表示最只匹配出现2次的结果:
p7:使用grep匹配“与”或者“或”模式,g r e p 命令加- E 参数,这一扩展允许使用扩展模式匹配。
这里想要查询 “北京,上海”:这个参数是大小写敏感的 我上一句命令-e 就没有结果

p8:空行
结合使用^和$可查询空行。使用- c 参数显示总行数:

p9:匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含 中文单引号’的的所有行:
p10:查询IP 地址
要查看n n n . n n n 网络地址,如果忘了第二部分中的其余部分,只知有两个句点,例如n nn . n n . . 。要抽取其中所有nnn.nnn IP 地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ }\。含义是任意数字出现3 次,后跟句点,接着是任意数字出现3 次,后跟句点。

p11:使用通配符*的匹配模式
这个很简单了,但是有一点要说明,星号“*"前要加点'.':

p12:使用$限制字符串结尾
查询以eng结尾的数据:

p13:定向输出结果到指定文件
将查询出以eng结果的行并输出到3.txt

p14:egrep
egrep 代表e x p r e s s i o n 或extended grep,适情况而定。e g r e p 接受所有的正则表达式, e g r e p 的一个显著特性是可以以一个文本作为保存的字符串,然后将之传给egrep 作为参数,为此使用- f 开关;egrep只是默认支持正则表达式扩展的,grep默认是不支持的 ,egrep要想支持正则表达式扩展需要加上-E

转载请注明出处,谢谢!
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics