Linux命令- grep +正则表达式

一、简介:

grep (global search regular expression(RE) and print out the line,全面搜索正则表达式并把行打印出来)是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。Unix的grep家族包括grep、egrep和fgrep egrep和fgrep的命令只跟grep有很小不同。egrep是grep的扩展,支持更多的re元字符, fgrep就是fixed grep或fast grep,它们把所有的字母都看作单词,也就是说,正则表达式中的元字符表示回其自身的字面意义,不再特殊。linux使用GNU版本的grep。它功能更强,可以通过-G、-E、-F命令行选项来使用egrep和fgrep的功能。

二、grep常规用法

-c:显示匹配行的数量

-i:不区分大小写

-n:在输出符合要求的行的同时显示行号

-v:输出显示不符合要求的行,即反向选择

-r:会把目录下所有的文件全部遍历

--color=auto:把匹配到的关键词加上颜色显示

-A:后跟一个数字n,表示输出显示符合要求的行以及下面n行

-B:后跟一个数字n,表示输出显示符合要求的行以及上面n行

-C:后跟一个数字n,表示打印符合要求的行以及上下各n行

举例说明:

1、将/etc/passwd目录下,出现 root 的行取出来

# grep  root  /etc/passwd

或者  # cat  /etc/passwd | grep  root

2、过滤出带有“root”关键词的行并输出行号

grep -n ‘root' 1.txt

3、过滤出不带有“root”关键词的行并输出行号

grep -nv ‘root' 1.txt

4、将/etc/passwd,将没有出现 root 和nologin的行取出来

# grep -v root  /etc/passwd | grep -v nologin

5、用 dmesg 列出核心信息,再以 grep 找出内含 eth 那行,在关键字所在行的前两行与后三行也一起捉出来显示

# dmesg | grep -n -A3 -B2  --color=auto  'eth'

另:在关键字的显示方面,grep 可以使用 --color=auto 来将关键字部分使用颜色显示。但是如果每次使用 grep 都得要自行加上 --color=auto 又很麻烦,可以使用 alias来处理。做法:在 ~/.bashrc 内加上这行:

alias  grep='grep --color=auto'

再以source ~/.bashrc 来立即生效即可~这样每次运行 grep就会自动加上颜色显示。

6、根据文件内容递归查找目录

# grep ‘energywise’ *         #在当前目录搜索带'energywise'行的文件

# grep  -r ‘energywise’ *     #在当前目录及其子目录下搜索'energywise'行的文件

# grep –l  -r ‘energywise’ *  #在当前目录及其子目录下搜索'energywise'行的文件,

但是不显示匹配的行,只显示匹配的文件

三、grep与正则表达式

.    表示除换行符之外的任意一个字符

*    表示重复0个或多个*前面的字符

+    表示重复1个或多个+前面的字符

?    表示0个或1个?前面的字符

.*   表示任意个任意字符(包含空行)

[ ]  用于指定一个字符集,无论[ ]中有多少东西,只能匹配其中的一个字符。

注意:+和?grep不支持,egrep才支持。

1、字符集和单词

表示除换行符之外的任意一个字符。如 .at 会匹配出诸如cat、hat、bat等字符串。

当我们在一组集合字节中,如果该字节组是连续的,例如大写英文/小写英文/数字等,可以使用[a-z],[A-Z],[0-9]等方式来书写,那么如果我们的要求字串是数字与英文,就将他全部写在一起,变成:[a-zA-Z0-9]。[[a-zA-Z]代表所有的英文字母。

例如:

egrep ‘[a-z]at’ /usr/words

结果如:Akhmatova     Alcatraz‘s      Allstate……

如果只希望匹配一个单词,需要为它加上一对分隔符“\<”和“\>”

\<[a-z]at\>  

结果如:bat  bat‘s  cat  eat……

过滤两个或多个关键词

grep -E ‘123|abc‘ filename   #找出文件中包含123或者abc的行

或者egrep ‘123|abc‘ filename

或者awk ‘/123|abc/‘ filename

egrep=grep -E

2、位置匹配

“^”匹配行首字符,“$” 匹配行尾字符。

例如:

过滤出以“the”开头的行,并显示行号

grep -n  '^the'  regular_express.txt

过滤掉/去除所有以#开头的行

grep  -v ‘^#‘ 1.txt

过滤掉/去除所有空行和以#开头的行

grep  -v ‘^$‘ 1.txt | grep -v ‘^#‘

过滤出以所有英文字母开头的行

grep ‘^[a-zA-Z]‘ 1.txt

过滤出以非数字开头的行

grep -v ‘^[0-9]‘ 1.txt  或者 grep ‘^[^0-9]‘ 1.txt

过滤出行尾结束为小数 (.) 的那一行

grep -n  '\.$'  regular_express.txt

3、重复

元字符

描述

*

重复0次或多次

+

重复一次或多次

重复0次或多次

{n}

重复n次

{n,}

重复n次或多次

{n,m}

重复不少于n次,不多于m次

例如:

匹配1个或者1个以上+前面的字符

egrep ‘o+‘ 1.txt

匹配0个或者1个?前面的字符

egrep ‘ao?‘ 1.txt

匹配roo或者匹配body

egrep ‘roo|body‘ 1.txt

用括号表示一个整体,匹配1个或者多个oo

egrep ‘(oo)+‘ 1.txt

过滤出“至少两个 o 以上的字串”时,就需要 ooo* ,即:

grep –n  'ooo*' regular_express.txt

如想要找出 g 开头与 g 结尾的行,当中的字符可有可无

grep -n  'g.*g' regular_express.txt

过滤出 g 后面接 2 5 o ,然后再接一个 g 的字串

grep  -n  'go\{2,5\}g'  regular_express.txt

注:笔者现在不想研究这个为什么grep后面的{},就加\转义,egrep就都没加,

目前搜到加转义是因为{}在shell中有特殊含义,而笔者也不知道什么事shell。

算了,以后有时间研究了再更新博客吧~

扩展grep(grep -E 或者 egrep)

使用扩展grep的主要好处是增加了额外的正则表达式元字符集。

过滤显示所有包含NWEA的行。如果不是使用egrep,而是grep,将不会有结果查出。

# egrep  'NW|EA'  testfile

对于标准grep,如果在扩展元字符前面加\grep会自动启用扩展选项-E

#grep  'NW\|EA'  testfile

4、反义

是指除了某个字符外,其他什么都可以。例如,表示除了字母y的任何字符的正则表达式是:[^y]

注:匹配所有不以字母y开头的行: ^[^y]

5、字符转义

一些字符具有一些特殊含义,如“.”在正则表达式中表示“除了换行符之外的任意一个字符”,那想要表示“.”本身就需要用到转义字符“\”,它可以取消所有元字符的特殊含义。例如:“\.”匹配句点“.”,如果要匹配“\”,就用“\\”表示。

例如:下面的正则表达式匹配的是“www.baidu.com”:  www\.baidu\.com  

6、分支和子表达式(子表达式即分组)

分支:如:^ht$    正则表示会执行“与”组合,表示所有以字母h开头,t结尾的行。

如果表示“或”组合的关系则使用“|”分隔。如匹配以字母h开头,或者t结尾的行:

^h|t$

子表达式:

如上例:用括号表示一个整体,匹配1个或者多个oo: egrep ‘(oo)+‘ 1.txt

又如:egrep “(or){2,}” /usr/words 匹配的是所有or重复2次或更多次的行。

如果:egrep “or{2,}” /usr/words  匹配的是字母o后面跟两个或更多字母r的行。


你可能感兴趣的:(Linux命令- grep +正则表达式)