shell命令之一天一见:grep

一、 简介

grep (缩写来自Globally search a Regular Expression and Print)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrepfgrep

grep的工作方式是这样的,它在一个或多个文件中搜索字符串模板。如果模板包括空格,则必须被引用,模板后的所有字符串被看作文件名。搜索的结果被送到屏幕,不影响原文件内容。

grep可用于shell脚本,因为grep通过返回一个状态值来说明搜索的状态,如果模板搜索成功,则返回0,如果搜索不成功,则返回1,如果搜索的文件不存在,则返回2。我们利用这些返回值就可进行一些自动化的文本处理工作。

Grep命令中允许指定的串语句是一个规则表达式,这是一种允许使用某些特殊键盘字符的指定字符串的方法,这种方法中的特殊键盘字符可以用于代表其他字符也可以进一步定义模式匹配工作方式。例如:grep ".*hood" essay1。该命令将在文件essay1中搜索,显示出包含带有字符串hood的字的每一行。命令行中的点表示的是hood之前可以有任意字符,星号指的是在字符串之前点号所表示的任意字符可以有任意个(其中的双引号是可有可无的,但是当语句中包含短语或者空格时就必须加双引号)[1]

二、用法

(1)   表达符集

1、^       锚定行的开始 ,如‘^google‘匹配所以以google开头的行

2、$       锚定行的结束, 如‘goolge$‘匹配所以以google结束的行

3、.        匹配一个非换行符(‘\n‘)字符, 如‘gr.p‘匹配gr后接一个任意字符

4、*       匹配零个或多个先前字符

5、[]      匹配一个指定范围内的字符,如‘[Gg]rep‘ 匹配Grep和grep

6、[^]   匹配一个不在指定范围内的字符,如:‘[^A-FH-Z]rep‘匹配不包含A-F和H-Z的一个字母开头,紧跟rep的行。

7、\<    锚定单词的开始,如:‘\<grep‘匹配包含以grep开头的单词的行。

8、\>    锚定单词的结束,如‘grep\>‘匹配包含以grep结尾的单词的行。

9、x\{m\}   重复字符x,m次,如:‘o\{5\}‘匹配包含5个o的行。

10、x\{m,\}  重复字符x,至少m次,如:‘o\{5,\}‘匹配至少有5个o的行。

11、x\{m,n\}  重复字符x,至少m次,不多于n次,如:‘o\{5,10\}‘匹配5--10个o的行。

12、\w  匹配文字和数字字符,也就是[A-Za-z0-9],如:‘G\w*p‘匹配以G后跟零个或多个文字或数字字符,然后是p。

13、\W  \w的反置形式,匹配一个或多个非单词字符,如点号句号等。

14、\b  单词锁定符,如: ‘\bgrep\b‘只匹配grep。[2]

15、\+  匹配一个或多个先前的字符。如:‘[a-z]\+able‘,匹配一个或多个小写字母后跟able的串,如loveable,enable,disable等。

16、\?  匹配零个或一个先前的字符。如:‘gr\?p‘匹配gr后跟一个或没有字符,然后是p的行。

17、a\|b\|c  匹配a或b或c。如:grep|sed匹配grep或sed

18、\(\)   分组符号,如:love\(ab\le\|rs\)ov\+匹配loveable或lovers,匹配一个或多个ov。

(2)命令选项

1、-?                    同时显示匹配行上下的?行,如:grep -2 pattern filename同时显示匹配行的上下2行。

2、-a, --text             等价于匹配text,用于(Binary file (standard input) matches)报错

3、-b,--byte-offset      打印匹配行前面打印该行所在的块号码。

4、-c,--count                 只打印匹配的行数,不显示匹配的内容。

5、-f File,--file=File      从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。

6、-h,--no-filename     当搜索多个文件时,不显示匹配文件名前缀。

7、-i,--ignore-case      忽略大小写差别。

8、-o, --only-matching   只显示正则表达式匹配的部分。(show only the part of a line matching PATTERN)

9、-q,--quiet           取消显示,只返回退出状态。0则表示找到了匹配的行。

10、-l,--files-with-matches  打印匹配模板的文件清单。

11、-L,--files-without-match    打印不匹配模板的文件清单。

12、-n,--line-number      在匹配的行前面打印行号。

13、-s,--silent    不显示关于不存在或者无法读取文件的错误信息。

14、-v,--revert-match   反检索,只显示不匹配的行。

15、-w,--word-regexp   如果被\<和\>引用,就把表达式做为一个单词搜索。

16、-R, -r, --recursive     递归的读取目录下的所有文件,包括子目录。 比如grep -R ‘pattern‘ test会在 test 及其子目录下的所有文件中,匹配 pattern。

17、-V,--version           显示软件版本信息。

18、-A6          查找某些字符的内容,并下延伸6行

19、-B6          查找某些字符的内容,并上延伸2行

20、-C1          查找某些字符的内容,并上和向下各延伸1行

这几行后面的数字直接影响延伸数量,并以--符号分割搜索行的结果

三、实例

1、$ ls -l | grep ‘^a‘         通过管道过滤ls -l输出的内容,只显示以a开头的行。

2、$ grep ‘test‘ d*       显示所有以d开头的文件中包含test的行。

3、$ grep ‘test‘ aa bb cc  显示在aa,bb,cc文件中匹配test的行。

4、$ grep ‘[a-z]\{5\}‘ aa 显示所有包含每个字符串有5个连续小写字符的字符串的行。

5、$ grep ‘w\(es\)t.*\1‘ aa  如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(\1),找到就显示该行。如果用egrep或grep -E,就不用"\"号进行转义,直接写成‘w(es)t.*\1‘就可以了。

6、 ps -ef|grep clustal2       查找指定进程“clustal2”

ps -ef|grep clustal2|wc -l     查找指定进程“clustal2”的运行个数

ps -ef|grep clustal2
longpen+ 27347 26704  0 11:13 pts/5    00:00:00 grep --color=auto clustal2

ps -ef|grep clustal2|wc -l
  1

7、cat test.txt | grep -f test2.txt

[[email protected] test]# cat test.txt
hnlinux
peida.cnblogs.com
ubuntu
ubuntu linux
redhat
Redhat
linuxmint
[root@localhost test]# cat test2.txt
linux
Redhat
[root@localhost test]# cat test.txt | grep -f test2.txt
hnlinux
ubuntu linux
Redhat
linuxmint
[root@localhost test]#

8、cat test.txt |grep -E "ed|at"    显示包含ed或者at字符的内容行

9、grep ‘[a-z]\{7\}‘ *.txt             显示当前目录下面以.txt 结尾的文件中的所有包含每个字符串至少有7个连续小写字符的字符串的行

注、1、在正则表达式中,注意转义字符的使用。如

grep "$a" file #引用变量a,查找变量a的值 
grep ‘$a‘ file #查找“$a”字符串 
grep ‘\\‘ file #查找‘\’字符

grep "\\\\" file # 由于是双引号,shell先把\\转义,就成了\,grep接收到的只有\\\,\是特殊字符 ,后面应该跟需要转义的字符,也就是\\,所以如果直接使用"//"那么就出现了错误。

[1] 来自百度百科

时间: 2024-08-14 01:18:19

shell命令之一天一见:grep的相关文章

几个常用的文本处理shell 命令:find、grep、sort、uniq、sed、awk

find 文件查找 查找txt和pdf文件 find . \( -name "*.txt" -o -name "*.pdf" \) -print 查找所有字母开头的文件 find . -name "[a-a]*" 否定参数->查找所有非txt文本 find . ! -name "*.txt" -print 指定搜索深度->打印出当前目录的文件(深度为1) find . -maxdepth 1 -type f 正则方

VIM中执行Shell命令(炫酷)

      我对VIM的认识仅仅是一款源码编辑器,在Linux下用来编辑程序源码或者某些服务的配置文件.最近无意中看到vim中竟然可以执行shell命令.第一次见,说句实话感觉好炫酷!不多说,我查了一些资料,一个一个尝试一下,留个笔记,备查.       vim中执行shell命令,有以下几种形式:       第一种 :!command       不退出vim,并执行shell命令command,将命令输出显示在vim的命令区域,不会改变当前编辑的文件的内容.执行:!ls -al命令,如下图

adb shell 命令返回&#39;grep&#39; 不是内部或外部命令,也不是可运行的程序

C:\Users\Vicky>adb shell dumpsys window windows | grep mCurrent'grep' 不是内部或外部命令,也不是可运行的程序或批处理文件. 解决方法:在adb shell 后面的内容加上双引号就不会报错啦 C:\Users\Vicky>adb shell "dumpsys window windows|grep mCurrent" mCurrentFocus=Window{cd554b4 u0 com.alibaba.a

shell命令--grep/egrep

shell命令--grep/egrep 0.grep/egrep命令的专属图床 点此快速打开文章[图床_shell命令grep/egrep] 1.grep/egrep命令的功能说明 ? grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据,如果配合正则表达式技术一起使用,则功能更加强大.egrep 是 grep 的扩展正则. 2.grep/egrep命令的语法格式 SYNOPSIS grep [OPTIONS] PATTERN [FILE...] g

Shell命令-文件及内容处理之grep(egrep)、join

文件及内容处理 - grep(egrep).join 1. grep(egrep):文本过滤工具 grep(egrep)命令的功能说明 grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据,如果配合正则表达式技术一起使用,则功能更加强大.egrep 是 grep 的扩展正则,后面讲三剑客时会讲的. grep命令的语法格式 grep [OPTIONS] [-e PATTERN | -f FILE] [FILE...]grep [-abcEFGhHilL

grep命令中文手册(info grep翻译)

body { font: 13.34px helvetica, arial, freesans, clean, sans-serif; color: black; line-height: 1.4em; padding: 0.7em } p { margin: 1em 0; line-height: 1.5em } pre,code { font: 12px Monaco, "Courier New", "DejaVu Sans Mono", "Bitst

Shell命令和流程控制

Shell命令和流程控制 在shell脚本中可以使用三类命令: 1)Unix 命令: 虽然在shell脚本中可以使用任意的unix命令,但是还是由一些相对更常用的命令.这些命令通常是用来进行文件和文字操作的. 常用命令语法及功能 echo "some text": 将文字内容打印在屏幕上 ls: 文件列表 wc –l filewc -w filewc -c file: 计算文件行数 计算文件中的单词数 计算文件中的字符数 cp sourcefile destfile: 文件拷贝 mv

Java调用Shell命令和脚本,致力于hadoop/spark集群

前言 说明的是,本博文,是在以下的博文基础上,立足于它们,致力于我的大数据领域! http://kongcodecenter.iteye.com/blog/1231177 http://blog.csdn.net/u010376788/article/details/51337312 http://blog.csdn.net/arkblue/article/details/7897396 第一种:普通做法 首先,编号写WordCount.scala程序. 然后,打成jar包,命名为WC.jar.

在 Ruby 中执行 Shell 命令的 6 种方法

我们时常会与操作系统交互或在 Ruby 中执行 Shell 命令.Ruby为我们提供了完成该任务的诸多方法. Exec Kernel#exec 通过执行给定的命令来替换当前进程,例如: $ irb >> exec 'echo "hello $HOSTNAME"' hello codefun $ 注意 exec 利用 echo 命令替换了 irb 进程,然后退出.因为 Ruby 实际上结束了该方法,所以只能有限使用.该方法的缺点是,你无法从 Ruby 脚本中知道命令是执行成功