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
Part 3 grep命令的 man
◎grep -- print lines matching a pattern (将符合样式的该行列出)
◎语法: grep [options]
PATTERN [FILE...]
grep用以在file内文中比对相对应的部分,或是当没有指定档案时,
由标准输入中去比对。 在预设的情况下,grep会将符合样式的那一行列出。
此外,还有两个程式是grep的变化型,egrep及fgrep。
其中egrep就等同於grep -E ,fgrep等同於grep -F 。
◎参数
1. -A NUM,--after-context=NUM
除了列出符合行之外,并且列出後NUM行。
ex: $ grep -A 1 panda file
(从file中搜寻有panda样式的行,并显示该行的後1行)
2. -a或--text
grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,
则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。
若加上-a参数则可将二进位档案视为文字档案搜寻,
相当於--binary-files=text这个参数。
ex: (从二进位档案mv中去搜寻panda样式)
(错误!!!)
$ grep panda mv
Binary file mv matches
(这表示此档案有match之处,详见--binary-files=TYPE )
$
(正确!!!)
$ grep -a panda mv
3. -B NUM,--before-context=NUM
与 -A NUM 相对,但这此参数是显示除符合行之外
并显示在它之前的NUM行。
ex: (从file中搜寻有panda样式的行,并显示该行的前1行)
$ grep -B 1 panda file
4. -C [NUM], -NUM, --context[=NUM]
列出符合行之外并列出上下各NUM行,预设值是2。
ex: (列出file中除包含panda样式的行外并列出其上下2行)
(若要改变预设值,直接改变NUM即可)
$ grep -C[NUM] panda file
5. -b, --byte-offset
列出样式之前的内文总共有多少byte ..
ex: $ grep -b panda file
显示结果类似於:
0:panda
66:pandahuang
123:panda03
6. --binary-files=TYPE
此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:
1.若有符合的地方:显示Binary file 二进位档名 matches
2.若没有符合的地方:什麽都没有显示。
若TYPE为without-match,遇到此参数,
grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。
若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。
Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。
7. -c, --count
不显示符合样式行,只显示符合的总行数。
若再加上-v,--invert-match,参数显示不符合的总行数。
8. -d ACTION, --directories=ACTION
若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。
预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;
若ACTION是skip(略过),资料夹会被grep略过:
若ACTION是recurse(递),grep会去读取资料夹下所有的档案,
此相当於-r 参数。
9. -E, --extended-regexp
采用规则表示式去解释样式。
10. -e PATTERN, --regexp=PATTERN
把样式做为一个partern,通常用在避免partern用-开始。
11. -f FILE, --file=FILE
事先将要搜寻的样式写入到一个档案,一行一个样式。
然後采用档案搜寻。
空的档案表示没有要搜寻的样式,因此也就不会有任何符合。
ex: (newfile为搜寻样式档)
$grep -f newfile file
12. -G, --basic-regexp
将样式视为基本的规则表示式解释。(此为预设)
13. -H, --with-filename
在每个符合样式行前加上符合的档案名称,若有路径会显示路径。
ex: (在file与testfile中搜寻panda样式)
$grep -H panda file ./testfile
file:panda
./testfile:panda
$
14. -h, --no-filename
与-H参数相类似,但在输出时不显示路径。
15. --help
产生简短的help讯息。
16. -I
grep会强制认为此二进位档案没有包含任何搜寻样式,
与--binary-files=without-match参数相同。
ex: $ grep -I panda mv
17. -i, --ignore-case
忽略大小写,包含要搜寻的样式及被搜寻的档案。
ex: $ grep -i panda mv
18. -L, --files-without-match
不显示平常一般的输出结果,反而显示出没有符合的档案名称。
19. -l, --files-with-matches
不显示平常一般的输出结果,只显示符合的档案名称。
20. --mmap
如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。
在某些状况,--mmap 能产生较好的效能。 然而,--mmap
如果运作中档案缩短,或I/O 错误发生时,
可能造成未定义的行为(包含core dump),。
21. -n, --line-number
在显示行前,标上行号。
ex: $ grep -n panda file
显示结果相似於下:
行号:符合行的内容
22. -q, --quiet, --silent
不显示任何的一般输出。请参阅-s或--no-messages
23. -r, --recursive
递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。
24. -s, --no-messages
不显示关於不存在或无法读取的错误讯息。
小: 不像GNU grep,传统的grep不符合POSIX.2协定,
因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。
Shell Script倾向将传统的grep移植,避开-q及-s参数,
且将输出限制到/dev/null。
POSIX: 定义UNIX及UNIX-like系统需要提供的功能。
25. -V, --version
显示出grep的版本号到标准错误。
当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。
26. -v, --invert-match
显示除搜寻样式行之外的全部。
27. -w, --word-regexp
将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。
28. -x, --line-regexp
将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出。
相关推荐
### Unix的grep命令详解 #### 一、简介 在Unix和Linux系统中,`grep`命令是最常用的文本搜索工具之一。它的全称是Global Regular Expression Print(全局正则表达式打印),主要用于在文本文件中搜索指定的模式。...
grep 命令是 Unix家族中的一种强大的文本搜索工具,能够使用正则表达式搜索文本,并把匹配的行打印出来。grep 命令的全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。 ...
Linux 中的 grep 命令是一种功能强大的文本搜索工具,通过模式匹配来查找文件中的内容。grep 命令可以根据用户的需求来查找特定的字符串、数字或正则表达式。 grep 命令的基本格式 grep [options] pattern [file] ...
“grep”命令在Linux中用于在文件中搜索特定的文本模式。它的基本语法是`grep [选项] 模式 [文件]`,其中选项可以设定搜索行为,如 `-i` 忽略大小写,`-v` 反向匹配,`-r` 递归搜索目录等。模式可以是简单的字符串,...
在IT领域,尤其是在系统管理中,了解不同UNIX变种之间的命令差异是至关重要的。HP UNIX(Hewlett-Packard's Unix)和AIX(Advanced Interactive eXecutive)都是流行的UNIX操作系统,它们各自拥有独特的命令集,但也...
grep命令是Unix/Linux系统中一个强大的文本搜索工具,它能够快速地在文件中查找符合特定模式的行。本文将深入介绍grep命令的基本用法、参数选项及其在实际操作中的应用。 1. **基本用法** `grep`命令的基本语法是`...
本文将从给定的文件信息出发,深入探讨Unix系统中的常用命令及其应用,同时也会提及C++编程在Unix环境下的实践案例。 #### 常用Unix命令概览 Unix系统中的命令种类繁多,涵盖了文件管理、进程控制、网络工具等多个...
Linux Grep命令是Linux系统中一个非常重要的文本搜索工具,其全称为“global search regular expression(RE) and print out the line”,意为全局搜索正则表达式并打印匹配的行。grep命令利用正则表达式的强大功能,...
"windows系统grep命令.7z"就是这样一个工具,它允许你在Windows中使用`grep`命令,从而实现跨平台的文本搜索功能。 `grep`(global regular expression print)命令是Linux和Unix系统中用于搜索含有特定模式的文本...
在IT领域,Unix和Linux操作系统是两种广泛使用的开源操作系统,尤其在服务器端和开发者社区中。它们都提供了命令行界面,允许用户通过一系列命令来控制和管理系统。这些命令是操作系统的心脏,使得用户能够执行各种...
在Unix或类Unix系统(如Linux)中,掌握一系列核心命令是进行高效文件管理和系统操作的基础。本文将针对标题中的几个关键命令进行深入解析:`chmod`、`cat`、`more`、`grep`以及`ftp`。 #### 1. `chmod` 命令 `...
`grep`命令作为Unix/Linux系统中的一个强大工具,被广泛应用于文本数据的搜索和过滤。本文将详细介绍`grep`命令的基本用法及其高级功能,帮助读者更好地理解和运用这一工具。 ### `grep`命令概述 `grep`(来自`g/...
在Unix操作系统中,掌握一些基本的命令是必不可少的。这些命令涵盖了从文件和目录操作到系统管理和用户交互的广泛领域。以下是对标题和描述中提到的一些关键Unix命令的详细解释: 1. **ls** - 列出目录内容。`ls`...
总的来说,这个“grep.rar”文件为Windows用户提供了一种简单的方式来获取和使用grep命令,从而在Windows环境中进行文本搜索操作。无论是开发者调试代码、系统管理员排查问题,还是普通用户查找特定文本,这个工具都...
在UNIX系统中,掌握操作命令是提升效率的关键。UNIX是一个强大的多用户、多任务操作系统,其命令行界面提供了丰富的功能,让使用者能够高效地管理文件、进行系统监控、执行程序等。以下是一些核心的UNIX系统操作命令...
### grep命令的深入解析与应用 #### 一、grep命令简介 `grep`是一个功能强大的文本搜索工具,它能够在一个或多个文件中搜索指定的模式(即字符串或正则表达式),并显示匹配的行。`grep`命令是UNIX/Linux系统中不可...
- `grep`:在文件中搜索特定模式。 - `find`:根据名称、类型、大小等条件查找文件。 - `head`/`tail`:查看文件开头或结尾部分。 3. **文件权限与所有权** - `chmod`:改变文件或目录的权限。 - `chown`/`...
在《UNIX下常用命令》这份资料中,详细介绍了UNIX和Linux环境下的基本命令与操作,这对于初学者乃至有经验的用户来说都是极其宝贵的资源。下面,我们将根据这份文档的内容,深入探讨UNIX下的一些核心概念和常用命令...
grep 命令是 Unix/Linux 系统中一个功能强大且常用的命令,主要用于在文件中搜索特定的内容,并将含有这些内容的行标准输出。grep 命令的全称是 Global Regular Expression Print,表示全局正则表达式版本,它的使用...
在Unix操作系统中,`last`命令是一个非常实用的工具,用于查看系统中用户登录、登出以及系统重新启动的历史记录。这个命令可以帮助系统管理员监控系统的使用情况,追踪未经授权的访问,或者简单地了解系统的活动历史...