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模式启动,你可以自己找到一个测试目录,第一步执行命令:
- vi 1.txt
接着按一下键盘的s键,看见linux屏幕左下角提示“—插入—”,表明当前已经变成插入模式,接着,大家鼠标右键复制一下下面的这段文本,
在linux屏幕里点击鼠标右键,内容就粘帖进去了。
然后大家按一下键盘的“ESC”键,然后输入一个冒号”:“ 屏幕里出现冒号之后,输入:wq,提示已写入。并已退出vi编辑模式。
- 安徽省 Anhuisheng
- 澳门特别行政区 Aomen Tebie Xingzhengqu
- 北京市 Beijingshi
- 重庆市 Chongqingshi
- 福建省 Fujiansheng
- 甘肃省 Gansusheng
- 广东省 Guangdongsheng
- 广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 黑龙江省 Heilongjiangsheng
- 河南省 Henansheng
- 湖北省 Hubeisheng
- 湖南省 Hunansheng
- 江苏省 Jiangsusheng
- 江西省 Jiangxisheng
- 吉林省 Jilinsheng
- 辽宁省 Liaoningsheng
- 内蒙古 Neimenggu zizhiqu
- 宁夏回族自治区 Ningxia Huizu zizhiqu
- 青海省 Qinghaisheng
- 陕西省 Shaanxisheng
- 山东省 Shandongsheng
- 上海市 Shanghaishi
- 山西省 Shanxisheng
- 四川省 Sichuansheng
- 台湾省 Taiwansheng
- 天津市 Tianjinshi
- 香港特别行政区 Xianggang Tebie Xingzhengqu
- 新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 西藏自治区 Xizang zizhiqu
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng
- cp 1.txt 2.txt
p1:多文件查询
在1.txt和2.txt中查询出包含”区”的行:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘区’ 1.txt 2.txt
- 1.txt:澳门特别行政区 Aomen Tebie Xingzhengqu
- 1.txt:广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 1.txt:宁夏回族自治区 Ningxia Huizu zizhiqu
- 1.txt:香港特别行政区 Xianggang Tebie Xingzhengqu
- 1.txt:新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 1.txt:西藏自治区 Xizang zizhiqu
- 2.txt:澳门特别行政区 Aomen Tebie Xingzhengqu
- 2.txt:广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 2.txt:宁夏回族自治区 Ningxia Huizu zizhiqu
- 2.txt:香港特别行政区 Xianggang Tebie Xingzhengqu
- 2.txt:新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 2.txt:西藏自治区 Xizang zizhiqu
- [www.linuxidc.com @localhost linuxidc]$ grep ‘区’ *
- 1.txt:澳门特别行政区 Aomen Tebie Xingzhengqu
- 1.txt:广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 1.txt:宁夏回族自治区 Ningxia Huizu zizhiqu
- 1.txt:香港特别行政区 Xianggang Tebie Xingzhengqu
- 1.txt:新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 1.txt:西藏自治区 Xizang zizhiqu
- 2.txt:澳门特别行政区 Aomen Tebie Xingzhengqu
- 2.txt:广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 2.txt:宁夏回族自治区 Ningxia Huizu zizhiqu
- 2.txt:香港特别行政区 Xianggang Tebie Xingzhengqu
- 2.txt:新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 2.txt:西藏自治区 Xizang zizhiqu
p2:行匹配
查询1.txt中包含“区”关键字的总行数,我们可以使用-c来显示行数。
- [www.linuxidc.com @localhost linuxidc]$ grep -c ‘区’ 1.txt
- 6
p3:显示行号
我们可以使用-n开关啦控制是否显示行号,这个行号是在文件里的实际的行号。
- [www.linuxidc.com @localhost linuxidc]$ grep -n ‘区’ 1.txt
- 2:澳门特别行政区 Aomen Tebie Xingzhengqu
- 8:广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 21:宁夏回族自治区 Ningxia Huizu zizhiqu
- 30:香港特别行政区 Xianggang Tebie Xingzhengqu
- 31:新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 32:西藏自治区 Xizang zizhiqu
- p4:显示非匹配行,也就是结果取反我们可以使用 -v 来取反。
- [www.linuxidc.com @localhost linuxidc]$ grep -v ‘区’ 1.txt
- 安徽省 Anhuisheng
- 北京市 Beijingshi
- 重庆市 Chongqingshi
- 福建省 Fujiansheng
- 甘肃省 Gansusheng
- 广东省 Guangdongsheng
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 黑龙江省 Heilongjiangsheng
- 河南省 Henansheng
- 湖北省 Hubeisheng
- 湖南省 Hunansheng
- 江苏省 Jiangsusheng
- 江西省 Jiangxisheng
- 吉林省 Jilinsheng
- 辽宁省 Liaoningsheng
- 内蒙古 Neimenggu zizhiqu
- 青海省 Qinghaisheng
- 陕西省 Shaanxisheng
- 山东省 Shandongsheng
- 上海市 Shanghaishi
- 山西省 Shanxisheng
- 四川省 Sichuansheng
- 台湾省 Taiwansheng
- 天津市 Tianjinshi
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng</span>
5:精确匹配我们可以使用\>符号来匹配以区结尾的字符串
- [www.linuxidc.com @localhost linuxidc]$ grep ‘区\>’ 1.txt
- 澳门特别行政区 Aomen Tebie Xingzhengqu
- 广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 宁夏回族自治区 Ningxia Huizu zizhiqu
- 香港特别行政区 Xianggang Tebie Xingzhengqu
- 新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 西藏自治区 Xizang zizhiqu </span>
p6:大小写敏感
grep 默认是大小写敏感的,我们可以使用-i开关来控制,如果不加-i 结果为空
[www.linuxidc.com @localhost linuxidc]$ grep -i ‘beijing’ 1.txt
- 北京市 Beijingshi
使用正则表达式使模式匹配加入一些规则,因此可以在抽取信息中加入更多选择。使用正则表达式时最好用单引号括起来,这样可以防止g r e p 中使用的专有模式与一些s h e l l 命令的特殊方式相混淆。
p1:范围模式
如果想要查询‘山东’和‘山西’的列表,可以用[ ]来指定范围。
- [www.linuxidc.com @localhost linuxidc]$ grep ‘山[东西]’ 1.txt
- 山东省 Shandongsheng
- 山西省 Shanxisheng
p2:匹配行首
如果想要查询”山“开头的省份,grep ‘^山’ 1.txt
结果同上。如果想查询非”山“开头的省份,
- [www.linuxidc.com @localhost linuxidc]$ grep ‘^[^山]’ 1.txt
- 安徽省 Anhuisheng
- 澳门特别行政区 Aomen Tebie Xingzhengqu
- 北京市 Beijingshi
- 重庆市 Chongqingshi
- 福建省 Fujiansheng
- 甘肃省 Gansusheng
- 广东省 Guangdongsheng
- 广西壮族自治区 Guangxi Zhuangzu zizhiqu
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 黑龙江省 Heilongjiangsheng
- 河南省 Henansheng
- 湖北省 Hubeisheng
- 湖南省 Hunansheng
- 江苏省 Jiangsusheng
- 江西省 Jiangxisheng
- 吉林省 Jilinsheng
- 辽宁省 Liaoningsheng
- 内蒙古 Neimenggu zizhiqu
- 宁夏回族自治区 Ningxia Huizu zizhiqu
- 青海省 Qinghaisheng
- 陕西省 Shaanxisheng
- 上海市 Shanghaishi
- 四川省 Sichuansheng
- 台湾省 Taiwansheng
- 天津市 Tianjinshi
- 香港特别行政区 Xianggang Tebie Xingzhengqu
- 新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
- 西藏自治区 Xizang zizhiqu
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng
- 这里可以在取反一次,这个只是娱乐[www.linuxidc.com @localhost linuxidc]$ grep -v ‘^[^山]’ 1.txt
- 山东省 Shandongsheng
- 山西省 Shanxisheng
p3:大小写设置
上面提到过了 可以用-i开关控制,也可以用[]包含大小写来实现:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘bei’ 1.txt
- 河北省 Hebeisheng
- 湖北省 Hubeisheng
- [www.linuxidc.com @localhost linuxidc]$ grep -i ‘bei’ 1.txt
- 北京市 Beijingshi
- 河北省 Hebeisheng
- 湖北省 Hubeisheng
- [www.linuxidc.com @localhost linuxidc]$ grep ‘[Bb]ei’ 1.txt
- 北京市 Beijingshi
- 河北省 Hebeisheng
- 湖北省 Hubeisheng
p4:匹配任意字符
我们还是查询以”山”开头的省份,
- [www.linuxidc.com @localhost linuxidc]$ grep ‘山.省’ 1.txt //这里限制了必须是三个字,点”.”只代表一个字或一个字母。</span><span style=”font-family:’Microsoft YaHei’;font-size:18px;”>山东省 Shandongsheng
- 山西省 Shanxisheng
- [www.linuxidc.com @localhost linuxidc]$ grep ‘[山河广].省’ 1.txt
- 广东省 Guangdongsheng
- 河北省 Hebeisheng
- 河南省 Henansheng
- 山东省 Shandongsheng
- 山西省 Shanxisheng
p5:范围组合
我们想查询以大写字母A-L开头,中间可以出现0到6个小写字母,包含sh和Sh,并且以i或者eng结尾的结果:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘[A-L][a-z]\{0,6\}[Ss]h[i,eng]$’ 1.txt
- 北京市 Beijingshi
p6:模式出现几率
上面的命令大家可能不懂”\{0,6\}“,现在就说明一下,这个是描述它前面的字母出现的次数,上例子中的意思就是a-z的字母可以连续出现0到6个。如果后边不写”\{1,\}”表示至少出现一次的,如果只写一个数字”\{2\}”,表示最只匹配出现2次的结果:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘a\{2\}’ 1.txt
- 陕西省 Shaanxisheng
p7:使用grep匹配“与”或者“或”模式,g r e p 命令加- E 参数,这一扩展允许使用扩展模式匹配。
这里想要查询 “北京,上海”:
- [www.linuxidc.com @localhost linuxidc]$ grep -e ‘北京|上海’ 1.txt
- [www.linuxidc.com @localhost linuxidc]$ grep -E ‘北京|上’ 1.txt
- 北京市 Beijingshi
- 上海市 Shanghaishi
- [www.linuxidc.com @localhost linuxidc]$
p8:空行
结合使用^和$可查询空行。使用- c 参数显示总行数:
- [www.linuxidc.com @localhost linuxidc]$ grep -c ‘^$’ 1.txt
- 0
p9:匹配特殊字符
查询有特殊含义的字符,诸如$ . ‘ ” * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含 中文单引号’的 的所有行:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘\’’ 1.txt
- 新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
要查看n n n . n n n 网络地址,如果忘了第二部分中的其余部分,只知有两个句点,例如n n n . n n . . 。要抽取其中所有nnn.nnn IP 地址,使用[ 0 – 9 ] \ { 3 \ } \ . [ 0 – 0 \ { 3 \ } \。含义是任意数字出现3 次,后跟句点,接着是任意数字出现3 次,后跟句点。
- grep ‘[0-9]\{3\}\.[0-9]\{3\}\.’ filename
p11:使用通配符*的匹配模式
这个很简单了,但是有一点要说明,星号“*”前要加点’.’:
- [www.linuxidc.com @localhost linuxidc]$ grep “.*sheng” 1.txt
- 安徽省 Anhuisheng
- 福建省 Fujiansheng
- 甘肃省 Gansusheng
- 广东省 Guangdongsheng
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 黑龙江省 Heilongjiangsheng
- 河南省 Henansheng
- 湖北省 Hubeisheng
- 湖南省 Hunansheng
- 江苏省 Jiangsusheng
- 江西省 Jiangxisheng
- 吉林省 Jilinsheng
- 辽宁省 Liaoningsheng
- 青海省 Qinghaisheng
- 陕西省 Shaanxisheng
- 山东省 Shandongsheng
- 山西省 Shanxisheng
- 四川省 Sichuansheng
- 台湾省 Taiwansheng
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng
p12:使用$限制字符串结尾
查询以eng结尾的数据:
- [www.linuxidc.com @localhost linuxidc]$ grep ‘eng$’ 1.txt
- 广东省 Guangdongsheng
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng
p13:定向输出结果到指定文件
将查询出以eng结果的行并输出到3.txt
- [www.linuxidc.com @localhost linuxidc]$ ls
- 1.txt 2.txt
- [www.linuxidc.com @localhost linuxidc]$ grep ‘eng$’ 1.txt > 3.txt
- [www.linuxidc.com @localhost linuxidc]$ ls
- 1.txt 2.txt 3.txt
- [www.linuxidc.com @localhost linuxidc]$ cat 3.txt
- 广东省 Guangdongsheng
- 贵州省 Guizhousheng
- 海南省 Hainansheng
- 河北省 Hebeisheng
- 云南省 Yunnansheng
- 浙江省 Zhejiangsheng
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