Linux三剑客之grep命令

GREP是Global search Regular Expression and Print out the line 的简称,即全面搜索正则表达式并把行打印出来。其使用正则表达式进行文本搜索并把行打印出来。

grep的一般格式为: grep 选项 模式 文件,其中文件名可以有多个,输入结果只打印到屏幕,并不改变原文件

grep 命令选项及其含义

选项含义
-c只输出匹配行的数量
-i搜索时忽略大小写
-h查询多文件时不显示文件名
-l只列出匹配的文件名,不列出具体的行
-n列出所有匹配行并显示行号
-s不显示不存在或无匹配的错误信息
-v显示不包含匹配文本的所有行(反选)
-w匹配整词
-x匹配整个行
-r递归搜索
-q禁止输出任何结果
-b打印匹配行距文件头部的偏移量,以字节为单位
-o与-b结合使用,打印匹配词距文件头部偏移量
-E支持扩展的正则表达式
-F不支持正则表达式

grep 模式非常灵活,可以式字符串、变量、正则表达式,但是无论何种模式,只要模式中包含空格,那么就需要将模式通过双引号或者单引号引起来,否则空格后面的单词会被误认为文件,例如grep “hello world” abc是正确的 grep hello world abc是错误的,可能world会被误认为也是文件名

举例:

使用grep命令同时搜索a.txt、b.txt中包含Centers单词的行(支持多个文件)

1.”-c” :表示打印匹配的行的数量,执行命令如下:

上述命名中a.txt和b.txt文件中匹配的行都是只有一行

2. “-n” : 表示列出所有匹配行并显示行号,执行命令如下:

上述命令中可以看到a.txt文件中的匹配行在第5行,b.txt匹配行在第四行

3. “-v” :表示显示不包含所有匹配模式的所有行(反选)

4.”-i” : 表示搜索的时候不区分大小写,如图:

5. “-h” : 表示查询多个文件时不显示文件名,默认情况下查询多个文件会显示文件名,使用-h后可以不显示文件名,如图:

6. “-l” : 表示只列出符合匹配的文件名,而不列出具体的行,如图:

7. “-s” :表示不显示不存在或者无匹配的错误信息,如图:

8. “-r” : 表示递归搜索,不仅搜索当前目录,还搜索子目录,如图:

9. “-w” : grep 命令支持正则表达式,但是使用-w选项后,元字符不在被解释成特殊含义,如图:

从上图中可以看到,不适用-w命令的时候,*表示通配符,可以打印出内容,使用-w命令后,*的作用不再是特殊字符,而变成普通字符,不打印内容

10. “-x” :表示匹配整行,即只有整行与模式匹配才会显示,如图:

上图中表示在a.txt文件中搜索centers的行,只有centers为单独一行的时候,才可以匹配,如果在一行的某一个部位是不会匹配的,只是独立的一行才可以

11.”-q” :加上-q选项后不在输出结果,而是以推出状态表示搜索是否成功,如果搜索成功那么退出状态0,如果搜索失败,那么退出状态1,如果命令错误或者其他错误,将返回2,如图:

上图中第一个命令,表示搜索成功,返回状态0,第二个命令搜索失败,返回状态1,第三个命令不存在d.txt文件,因此返回状态2

grep与正则结合使用的例子:

1.通过[]与grep 来实现搜索匹配行不区分大小写,如图:

POSIX 字符类

posix字符类选项及其含义

选项意义
[:upper:]表示大写字母[A-Z]
[:lower:]表示小写字母[a-z]
[:digit:]表示阿拉伯数字[0-9]
[:alnum:]表示大小写字母以及阿拉伯数字[0-9a-zA-Z]
[:space:]表示空格或者Tab键
[:alpha:]表示大小写字母[a-z A-Z]
[:cntrl:]表示Ctrl键
[:graph:]或[:print:]表示ASCII码33-126之间的字符
[:xdigit:]表示16进制数字[0-9A-Fa-f]

例如,搜索匹配以大写字母开头的行,如图:

其余用法一样,再次不在列举

精确匹配:

首先在a.txt文件中查找匹配the的文本行,可以看到有多个匹配,其中还有的是单词中的一部分,如图:

如果要精确匹配,只显示单独的the,不显示包含在其他单词内部,此时需要使用正则表达式,精确匹配符号\<\> ,如图:

或字符:

或字符”|” 是扩展正则表达式中定义的,grep 需要加-E参数才可以使用,例如,查找a.txt文件中匹配centers或者Centers的行,如图:

上述命令中如果不加-E参数,前方需要使用命令egrep才可以

grep命令族简介:

  1. grep : 标准grep命令,支持基本正则表达式
  2. egrep :扩展grep命令,支持基本以及扩展正则表达式(与 grep -E 等价)
  3. fgrep : 快速grep 命令,不支持正则表达式(与grep -f 等价)

判断一个字符串中是否包含另一个字符串时可以使用grep来搜索进行判断

标签