版权声明:本文为博主(微博@Gary的影响力)原创文章,未经博主允许不得转载。博客地址:http://garyelephant.me
Garygaowork#gmail.com
grep在一个或多个文件中查找与模式字符串(pattern)匹配的行,并将搜索的结果打印出来,不会修改原文件内容。
使用grep 命令的语法为:
$grep [option(s)] pattern [file(s)]
其中option为grep命令的选项,pattern为要匹配的简单字符串或携带特殊字符的模式字符串,file为文件列表,可有多个文件。
Part 1 grep中经常用到的选项(option)
-i 忽略pattern中的大小写
$grep -i hAL /etc/passwd
-w 搜索整个词汇
忽略大小写并搜索整个词汇"samba"
$grep -iw "samba" /tec/samba/smb.conf
# This is the main Samba configuration file. You should read the
# here. Samba has a huge number of configurable options (perhaps too
# For a step to step guide on installing, configuring and using samba,
# read the Samba-HOWTO-Collection. This may be obtained from:
-r 递归地指定文件所在目录中的所有子目录中的文件
-v 查找与pattern不匹配的行
定义输出方式:
-o 仅打印出匹配的一段,而非整行
-n 打印出匹配行的行号
-l 仅打印出匹配行所在的文件
-c 打印出每个文件中匹配行的总数
-A num 显示匹配行之后的num行
-B num 显示匹配行之前的num行
-C num 相当于 -A num 与 -B num 的组合
--color=auto 将pattern在匹配行中高亮输出
注意:
(1).选项区分大小写
(2).多个选项可以一起使用,例如:
$grep -iwr
(3).grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。
Part 2 在grep中使用正则表达式
1.基本的匹配模式
尽管直接使用最简单直接的pattern字串可以完成一些重要任务,但是grep命令的真正威力在于它可以使用正则表达式来完成复杂的模式字串的匹配。grep命令中使用的是“基本的正则表达式”,如果想使用更高级的正则表达式规则,需要指定选项 -E ,相当于egrep命令。
以下字符或字符串在正则表达式的规则中具有特殊意义,如,*,+,[,],^,$,\,{,}
它们的多种组合展示了基本的正则表达式的匹配模式:
(1)'.'匹配任意单一字符
(2) X* 与包含连续0个或多个字符X的行匹配
(3) X\+ 与包含连续1个或多个字符X的行匹配
(4) [a-z] 与包含a-z的其中一个字符的行匹配
(5) [^a-z] 与不包含a-z的其中一个字符的行匹配
(6) [0-9] 与包含0-9的其中一个字符的行匹配
(7) ^hello 与以字串hello起始的行匹配
(8) hello$ 与以字串hello结束的行匹配
(9) \ 转义字符,后跟特殊字符,可表示它本来的涵义
(10)
\d 匹配一个数字字符. 等价于 [0-9]
\D 匹配一个非数字符. 等价于 [^0-9]
\w ,等价于 "[A-Za-z0-9_]"
\W 匹配任何非单词字符,等价于 "[^A-Za-z0-9]"
\s 匹配任何空白字符, 包括空格 制表符 换页符 等等. 等价于[\f\n\r\t\v]
\S 匹配任何非空白字符. 等价于 [^\f\r\n\t\v]
\b 匹配一个单词边界,也就是指单词和空格间的位置。
\B 匹配非单词边界。
如,
$grep '[' filename
返回结果为grep : Invalid regular expression
而 ,
$grep '\[' filename
会匹配所有包含'['(不包括单引号)的行。
X\{n\} 与连续包含n个字符X的行匹配
(11) X\ {n,\} 与至少连续包含n个字符X的行匹配 (注意n后面的',')
(12) X \{,m\} 与最多连续包含m个字符X的行匹配 (注意m前面的',')
(13) X \{n,m\} 与最少包含n个,最多包含m个字符X的行匹配
注意:
1.不要混淆shell 中的".","*"与正则表达式中的".","*",很多刚开始学的人都会犯错。
在正则表达式中,"."很像shell中的"?",它与任意单一字符匹配。而"*"在正则表达式中的使用,表示"*"前面的字符可能出现0次或1次或多次,与shell中的"*"涵义不同。
2.grep 中模式(pattern)之间的OR,AND,NOT 操作
1.grep or 操作(4 种方法)
1.1 使用 \|
$grep 'pattern1\|pattern2' filename
1.2.使用 -E 选项
grep -E 代表扩展的正则表达式. 若使用-E选项,则可以去掉转义字符'\',直接使用'|'
$grep -E 'pattern1|pattern2' filename
1.3.使用 egrep 命令
egrep 相当于 ‘grep -E’.
1.4.使用 -e 选项
通过指定多个-e选项来应用多个pattern,多个pattern之间是“或”的关系
$grep -e pattern1 -e pattern2 filename
2.grep AND 操作
2.1 使用 -E选项和模式字符 'pattern1.*pattern2'
$grep -E 'pattern1.*pattern2' filename
以上命令为在filename文件中查找既与pattern1匹配又与pattern2匹配的行
$grep -E 'pattern1.*pattern2|pattern2.*pattern1' filename
2.2 利用管道实现
$grep -E 'pattern1' filename | grep -E 'pattern2'
3.Grep NOT 操作
3.1使用 -v 选项
$grep -v 'pattern' filename
以上命令在filename文件中查找不能与pattern匹配的行
Part 3 grep命令的 Examples
1. 对文件中的空行计数
$grep -c "^$" filename
2.查找在“hello”有任意长度字串的行
$grep ".*hello" filename
3.查找在'hi'与'hello'之间至少有一个空格的行
$grep "hi \+hello" filename
4.查找在'hi'与'hello'之间没有空格或有多个空格的行
$grep "hi *hello" filename
5..查找在'hi'与'hello'之间没有空格或有1个空格的行
$grep "hi \?hello" filename
6.查找ip地址127.0.0.1 (其中包含特殊字符 '.')
$grep "127\.0\.0\.1" filename
7.过滤其他命令的输出结果
$ls --help | grep "dired"
将ls命令的帮助文本,作为grep的输入,查找与"dired"匹配的行
输出为:-D, --dired generate output designed for Emacs' dired mode
8.从系统日志中获得有用的信息
在apache日志文件中查找以IP地址开头,包含数字200的行
$grep -Eoc "^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}.* 200" /srv/www/example.com/logs/access.log
References:
[1]How To Use Linux Grep Command To Find Strings
http://www.expertslogin.com/linux-administration/linux-grep-command-find-strings/
[2]Grep command in Linux explained Guide Discover grep and never lose anything again
http://www.techradar.com/news/software/operating-systems/grep-command-in-linux-explained-699455
[3] Search and Filter Text with Grep http://library.linode.com/linux-tools/common-commands/grep
[4] Linux / Unix Command: grep http://linux.about.com/od/commands/l/blcmdl1_grep.htm
[5] Regular Expressions in Grep Command with 10 Examples
http://www.thegeekstuff.com/2011/01/regular-expressions-in-grep-command/
[6] Using grep http://www.linuxjournal.com/article/1149?page=0,1
[7]15 Practical Grep Command Examples In Linux / UNIX (很丰富实用的举例)
http://www.thegeekstuff.com/2009/03/15-practical-unix-grep-command-examples/
(The Geek Stuff 是个很不错的linux博客)
[8]7 Linux Grep OR, Grep AND, Grep NOT Operator Examples
http://www.thegeekstuff.com/2011/10/grep-or-and-not-operators/
[9]HowTo:Use Grep Command in Linux/Unix[examples]
http://www.cyberciti.biz/faq/howto-use-grep-command-in-linux-unix/
[10]Advanced Regular Expressions in Grep Command with 10 Examples – Part II
(更高级别的正则表达式)
http://www.thegeekstuff.com/2011/01/advanced-regular-expressions-in-grep-command-with-10-examples-%E2%80%93-part-ii/
[11]详细介绍Linux grep指令 http://os.51cto.com/art/200912/168882.htm
[12] 关于Linux Grep命令使用的详细介绍
http://*.chinaunix.net/system/linux/2007-03-15/5110.shtml
转载本文请注明作者和出处[Gary的影响力]http://garyelephant.me,请勿用于任何商业用途!
Author: Gary Gao 关注互联网、分布式、高并发、自动化、软件团队
支持我的工作: https://me.alipay.com/garygao
如何使用Unix/Linux grep命令——磨刀不误砍柴工系列的更多相关文章
-
28个Unix/Linux的命令行神器_转
28个Unix/Linux的命令行神器 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具,有一些是大家熟悉的,有一些是非常有用的,有一些是不为人知的.这些工具 ...
-
linux grep命令详解
linux grep命令详解 简介 grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来 ...
-
28 个 Unix/Linux 的命令行神器
28 个 Unix/Linux 的命令行神器 下面是Kristóf Kovács收集的28个Unix/Linux下的28个命令行下的工具(原文链接),有一些是大家熟悉的,有一些是非常有用的,有一些 ...
-
linux grep命令
linux grep命令1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressio ...
-
linux grep命令总结
风生水起善战者,求之于势,不责于人,故能择人而任势. 博客园 首页 新随笔 联系 订阅 管理 posts - 791, comments - 394, trackba ...
-
Linux grep命令详解[备份]
linux grep命令 1.作用Linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹 配的行打印出来.grep全称是Global Regular Expressi ...
-
linux grep命令(linux在文件中搜索内容)
转自:https://www.cnblogs.com/end/archive/2012/02/21/2360965.html linux grep命令 1.作用Linux系统中grep命令是一种强大的 ...
-
磨刀不误砍柴工——VS生成事件
如果说磨刀不误砍柴工,同样用好Visual Studio,会大大增加咱.NET程序猿效率.本文说的就是Visual Studio中的生成事件,在解决方案下右击某个项目然后选择 “属性” 打开窗口后即可 ...
-
Unix/Linux之命令备忘录
ps:是显示瞬间进程的状态,并不动态连续 kill:用于杀死进程或者给进程发送信号 // 在Linux下查看所有java进程命令 ps -ef | grep java: // 停止所有java进程命 ...
随机推荐
-
Eclipse 启动Tomcat 超时报错的解决方案
在用eclipse开发项目 用tomcat发布项目的时候 会提示超时, Server Tomcat v7.0 Server at localhost was unable to start wit ...
-
XCODE打包安装包步骤
1. 2. 3. 4. 5. 6. 7. 导出之后就可以看到一个后缀为.ipa 的安装包.
-
使Asp.net WebApi支持JSONP和Cors跨域访问
1.服务端处理 同源策略(Same Origin Policy)的存在导致了“源”自A的脚本只能操作“同源”页面的DOM,“跨源”操作来源于B的页面将会被拒绝.同源策略以及跨域资源共享在大部分情况下针 ...
-
Vue开源项目汇总(史上最全)(转)
目录 UI组件 开发框架 实用库 服务端 辅助工具 应用实例 Demo示例 UI组件 element ★13489 - 饿了么出品的Vue2的web UI工具套件 Vux ★8133 - 基于Vue和 ...
-
Coursera台大机器学习技法课程笔记05-Kernel Logistic Regression
这一节主要讲的是如何将Kernel trick 用到 logistic regression上. 从另一个角度来看soft-margin SVM,将其与 logistic regression进行对比 ...
-
docker下搭建fastfds集群版
搭建过程参考 作者 https://me.csdn.net/feng_qi_1984 的课程视频 声明:集群版是在我之前写的单机版基础之上进行搭建的,我将安装了fastfds单机版的docker打包成 ...
-
linux和window是文件挂载
1. 首先在windows下面创建share文件夹并设置共享(右键->属性->共享)2. 确认ubuntu安装了mount.cifs,apt-get install mount.cifs ...
-
搭建Eureka集群
1.pom文件 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="htt ...
-
Ubuntu 16.04 安装 Gnome 桌面环境
个人博客链接:Ubuntu 16.04 安装 Gnome 桌面环境
-
Using the FutureRequestExecutionService Based on classic (blocking) I/O handle a great number of concurrent connections is more important than performance in terms of a raw data throughput
Chapter 7. Advanced topics http://hc.apache.org/httpcomponents-client-ga/tutorial/html/advanced.html ...