`

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模式启动,你可以自己找到一个测试目录,第一步执行命令:
vi 1.txt
上面这句命令的意思是:如果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
复制一份1.txt命名为2.txt , 好了 ,练习开始。

p1:多文件查询
在1.txt和2.txt中查询出包含”区"的行:

[channel@localhost kingviker]$ 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 
或者查询出当前文件夹下的所有文件中包含“区” 的行:
[channel@localhost kingviker]$ 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来显示行数。

[channel@localhost kingviker]$ grep -c '区' 1.txt
6

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

[channel@localhost kingviker]$ 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 来取反。

[channel@localhost kingviker]$ 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


p5:精确匹配
我们可以使用\>符号来匹配以区结尾的字符串

[channel@localhost kingviker]$ grep '区\>' 1.txt
澳门特别行政区 Aomen Tebie Xingzhengqu 
广西壮族自治区 Guangxi Zhuangzu zizhiqu
宁夏回族自治区 Ningxia Huizu zizhiqu 
香港特别行政区 Xianggang Tebie Xingzhengqu 
新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu
西藏自治区 Xizang zizhiqu 
我们可以使用\《符号来匹配以区开头的字符串,结果为空。

p6:大小写敏感
grep 默认是大小写敏感的,我们可以使用-i开关来控制,如果不加-i 结果为空:
[channel@localhost kingviker]$ grep -i 'beijing' 1.txt 
北京市 Beijingshi


正则表达式

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

p1:范围模式
如果想要查询‘山东’和‘山西’的列表,可以用[ ]来指定范围。

[channel@localhost kingviker]$ grep '山[东西]' 1.txt 
山东省 Shandongsheng 
山西省 Shanxisheng 

p2:匹配行首
如果想要查询”山“开头的省份,
grep  '^山' 1.txt 
结果同上。
如果想查询非”山“开头的省份,

[channel@localhost kingviker]$ 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


这里可以在取反一次,这个只是娱乐
[channel@localhost kingviker]$  grep -v  '^[^山]' 1.txt 
山东省 Shandongsheng 
山西省 Shanxisheng 

p3:大小写设置
上面提到过了 可以用-i开关控制,也可以用[]包含大小写来实现:
[channel@localhost kingviker]$ grep 'bei' 1.txt 
河北省 Hebeisheng
湖北省 Hubeisheng 
[channel@localhost kingviker]$ grep -i 'bei' 1.txt 
北京市 Beijingshi
河北省 Hebeisheng
湖北省 Hubeisheng 
[channel@localhost kingviker]$ grep  '[Bb]ei' 1.txt 
北京市 Beijingshi
河北省 Hebeisheng
湖北省 Hubeisheng 

p4:匹配任意字符
我们还是查询以"山"开头的省份,
[channel@localhost kingviker]$ grep '山.省' 1.txt  //这里限制了必须是三个字,点”.”只代表一个字或一个字母。山东省 Shandongsheng 
山西省 Shanxisheng 
我们如果想查询想查询,以“山,河,广'开头的省份,
[channel@localhost kingviker]$ grep '[山河广].省' 1.txt 
广东省 Guangdongsheng
河北省 Hebeisheng
河南省 Henansheng 
山东省 Shandongsheng 
山西省 Shanxisheng 

p5:范围组合
我们想查询以大写字母A-L开头,中间可以出现0到6个小写字母,包含sh和Sh,并且以i或者eng结尾的结果:
[channel@localhost kingviker]$ grep '[A-L][a-z]\{0,6\}[Ss]h[i,eng]$' 1.txt 
北京市 Beijingshi

p6:模式出现几率
上面的命令大家可能不懂”\{0,6\}“,现在就说明一下,这个是描述它前面的字母出现的次数,上例子中的意思就是a-z的字母可以连续出现0到6个。如果后边不写”\{1,\}"表示至少出现一次的,如果只写一个数字”\{2\}",表示最只匹配出现2次的结果:
[channel@localhost kingviker]$ grep 'a\{2\}' 1.txt 
陕西省 Shaanxisheng 

p7:使用grep匹配“与”或者“或”模式,g r e p 命令加- E 参数,这一扩展允许使用扩展模式匹配。
这里想要查询 “北京,上海”:
[channel@localhost kingviker]$ grep -e '北京|上海' 1.txt 
[channel@localhost kingviker]$ grep -E '北京|上' 1.txt 
北京市 Beijingshi
上海市 Shanghaishi 
[channel@localhost kingviker]$ 
这个参数是大小写敏感的 我上一句命令-e 就没有结果

p8:空行
结合使用^和$可查询空行。使用- c 参数显示总行数:
[channel@localhost kingviker]$ grep -c '^$' 1.txt 
0

p9:匹配特殊字符
查询有特殊含义的字符,诸如$ . ' " * [] ^ | \ + ? ,必须在特定字符前加\。假设要查询包含 中文单引号’的的所有行:
[channel@localhost kingviker]$ grep '\’' 1.txt 
新疆维吾尔族自治区 Xinjiang Weiwu’erzu zizhiqu

p10:查询IP 地址
要查看n n n . n n n 网络地址,如果忘了第二部分中的其余部分,只知有两个句点,例如n nn . n n . . 。要抽取其中所有nnn.nnn IP 地址,使用[ 0 - 9 ] \ { 3 \ } \ . [ 0 - 0 \ { 3 \ }\。含义是任意数字出现3 次,后跟句点,接着是任意数字出现3 次,后跟句点。
grep '[0-9]\{3\}\.[0-9]\{3\}\.' filename

p11:使用通配符*的匹配模式
这个很简单了,但是有一点要说明,星号“*"前要加点'.':
[channel@localhost kingviker]$ 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结尾的数据:
[channel@localhost kingviker]$ grep 'eng$' 1.txt 
广东省 Guangdongsheng
贵州省 Guizhousheng
海南省 Hainansheng
河北省 Hebeisheng
云南省 Yunnansheng
浙江省 Zhejiangsheng

p13:定向输出结果到指定文件
将查询出以eng结果的行并输出到3.txt
[channel@localhost kingviker]$ ls
1.txt  2.txt
[channel@localhost kingviker]$ grep 'eng$' 1.txt > 3.txt
[channel@localhost kingviker]$ ls
1.txt  2.txt  3.txt
[channel@localhost kingviker]$ 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

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

相关推荐

    linux grep命令详解

    ### Linux 下 `grep` 命令详解 ...通过以上介绍,我们可以看到 `grep` 命令的强大之处在于其丰富的选项配置,能够满足不同场景下的文本搜索需求。掌握这些选项可以帮助我们更高效地完成文本检索任务。

    linux grep命令详解_linux_grep_

    Linux中的`grep`命令是文本处理工具中的重要一员,它在系统管理和日常工作中发挥着巨大的作用。`grep`源自于“global regular expression print”,即全局正则表达式打印,它的主要功能是从输入流(通常是文件或管道...

    windows上linux命令工具 grep 等等

    这个压缩包提供了一系列在Windows上运行的Linux命令,包括`grep`等常用工具,使得Windows用户可以在不离开Windows系统的情况下享受Linux命令的便利。 1. **grep命令**:在Linux中,`grep`是一个强大的文本搜索工具...

    linux-shell脚本命令:grep命令简介

    grep命令是Linux系统中非常重要的文本搜索工具,它可以对文件中的内容进行搜索,并根据用户的搜索模式,显示出包含该模式的行。grep是Global Regular Expression Print的缩写,它支持POSIX基本正则表达式和扩展正则...

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

    如果您有任何疑问或想要了解更多关于`grep`和其他Linux命令的信息,请随时留言交流。 以上内容为Linux中利用`grep`命令检索文件内容的详细介绍,希望能够帮助到您。如果觉得有用,请记得收藏并分享给需要的朋友!

    Linux Grep命令使用的详细介绍

    Linux Grep命令是Linux系统中一个非常重要的工具,主要用于在文本文件中搜索匹配特定模式的行。grep全称为“global search regular expression(RE) and print out the line”,即全面搜索正则表达式并打印出匹配的行...

    linux中grep命令的使用.docx

    Linux 中 grep 命令的使用 grep 命令是 Unix家族中的一种强大的文本搜索工具,能够使用正则表达式搜索文本,并把匹配的行打印出来。grep 命令的全称是 Global Regular Expression Print,表示全局正则表达式版本,...

    windows-cmd-linux-grep等命令扩充

    这些工具集不仅包含了类似于“grep”的命令,还提供了许多其他Linux命令的实现。 “grep”命令在Linux中用于在文件中搜索特定的文本模式。它的基本语法是`grep [选项] 模式 [文件]`,其中选项可以设定搜索行为,如 ...

    Linux grep 命令详解

    Linux grep 命令详解 Linux 中的 grep 命令是一种功能强大的文本搜索工具,通过模式匹配来查找文件中的内容。grep 命令可以根据用户的需求来查找特定的字符串、数字或正则表达式。 grep 命令的基本格式 grep ...

    linuxgrep命令.pdf

    该命令是Linux系统中用于文本搜索的核心工具之一,具有强大的模式匹配能力。 1. 基本用法: grep [options] pattern [files] 其中,options 可以指定为不同的选项组合,用于定制搜索行为。pattern 是你想要搜索的...

    Linux中grep命令参数及用法详解---linux管道命令grep

    ### Linux中的`grep`命令参数及用法详解 `grep`是Linux系统中非常重要的文本搜索工具之一,它能够帮助用户高效地查找文件中的特定模式或字符串。`grep`不仅适用于简单的文本匹配,还能处理复杂的正则表达式,是进行...

    最全的linux下grep命令的使用方法

    Linux 下 Grep 命令的使用方法 Grep 命令是 Linux 中一个功能强大且广泛使用的命令,它可以在文件中搜索包含指定模式的行,并将其输出出来。Grep 命令的基本格式为:`grep [选项]... PATTERN [FILE]...` 在使用 ...

    linux 下grep命令C代码实现

    __RCSID("$NetBSD: grep.c,v 1.11 2012/05/06 22:27:00 joerg Exp $"); #include #include #include #include #include #include #include #include #include #include #include #include #include #...

    Linux下使用grep命令分析网站日志

    使用Linux命令中的grep命令来分析网站日志的方法和技巧,合并网站日志,拆分我们想要的日志

    Linux命令大全完整版.pdf

    本文将详细解读《Linux命令大全完整版.pdf》中所收录的各类命令,以帮助读者更好地理解和运用Linux命令。 1. Linux系统管理命令 系统管理命令是Linux系统中最重要的命令类别之一,涵盖了用户管理、进程控制、系统...

    Linux命令大全搜索工具

    Linux 命令大全搜索工具提供了一个详细的命令列表,包括 A series 命令、apachectl 命令、arp 命令、atop 命令、awk 命令、axel 命令等。这些命令涵盖了 Linux 系统中的各种功能,例如文件管理、网络管理、系统管理...

    linux grep 程序源码

    Linux中的`grep`命令是日常系统管理和数据处理中不可或缺的工具,它用于在文本文件或标准输入中搜索指定模式,并打印匹配行。`grep`的名字来源于"Global Regular Expression Print",意味着全局正则表达式打印。现在...

    11.24 sed,if else语句,写文件linux万年历命令,grep.rar

    "11.24 sed,if else语句,写文件linux万年历命令,grep.rar"这个压缩包文件包含了几个核心的Linux命令学习资料,包括`sed`、`if-else`语句、创建万年历命令以及`grep`命令。接下来,我们将深入探讨这些知识点。 ...

    linux ps 命令详解

    **Linux `ps` 命令详解** 在Linux操作系统中,`ps`(Process Status)命令是用于查看系统当前进程状态的工具。它能够显示进程的实时信息,帮助用户了解系统的运行情况,进行进程管理。`ps`命令历史悠久,功能强大,...

Global site tag (gtag.js) - Google Analytics