正则三剑客 之 grep

1. 正则介绍

在计算机科学中,正则表达式是这样解释的:它是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。

  • 正则就是一串有规律的字符串
  • 在很多文本编辑器或其他工具里,正则表达式通常被用来检索和/或替换那些符合某个模式的文本内容。许多程序设计语言都支持利用正则表达式进行字符串操作。对于系统管理员来讲,正则表达式贯穿在我们的日常运维工作中,无论是查找某个文档,抑或查询某个日志文件分析其内容,都会用到正则表达式。
  • 其实正则表达式,只是一种思想,一种表示方法。只要我们使用的工具支持表示这种思想那么这个工具就可以处理正则表达式的字符串。常用的工具有grep, sed, awk 等.。

2. grep命令

是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep在centOS6和centOS7中的区别,centOS7中自带--color属性, ,就是把匹配到的关键字用颜色标注出来了。

语法: grep [-cinvABC] ‘word’ filename

-c :打印符合要求的行数
-i :忽略大小写
-n :在输出符合要求的行的同时连同行号一起输出
-v :打印不符合要求的行,取反
-r : 遍历所有子目录
-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行
-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行
-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行
-w :只显示全字符合的列。 
-x :只显示全列符合的列。

3. 实例

3.1 过滤出带有某个关键词的行并输出行号

grep -n 'root' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin

3.2 过滤不带有某个关键词的行,并输出行号

grep -vn 'nologin' /etc/passwd  
1:root:x:0:0:root:/root:/bin/bash
6:sync:x:5:0:sync:/sbin:/bin/bash
7:shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
...

3.3 过滤出所有包含数字的行

“[ ]”的应用,如果是数字的话就用[0-9]这样的形式,当然有时候也可以用这样的形式[15]即只含有1或者5,注意,它不会认为是15。如果要过滤出数字以及大小写字母则要这样写[0-9a-zA-Z]。另外[ ]还有一种形式,就是[^字符] 表示除[ ]内的字符之外的字符。

grep '[0-9]'/etc/inittab    过滤出所有包含0-9数字的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
...

grep -v '[0-9]'/etc/inittab  过滤出所有不包含0-9数字的行,-v是取反
grep '^[^a-zA-Z]' test.txt  过滤出所有不以英文字母开头的行,[^字符]表示除[ ]内的字符之外的字符

3.4 过滤出文档中以某个字符开头或者以某个字符结尾的行

在正则表达式中,“^”表示行的开始,”$”表示行的结尾,那么空行则表示“^$”。

grep -v '^#' /etc/inittab  筛选出非空行
grep -v '^#' /etc/inittab | grep -v  '^$' 
筛选出文档中以‘#’开头的且为非空的行
grep 'sh$' /etc/passwd  筛选出以“sh”结尾的行

3.5 过滤任意一个字符与重复字符

grep 'r.o' test.txt
“.”表示任意一个字符

grep 'oo*' test.txt
“*”表示零个或多个前面的字符

grep '.*' test.txt  正则中的贪婪匹配
“.*”表示零个或多个任意字符,空行也包含在内

3.6 指定要过滤字符出现的次数

这里用到了{ },其内部为数字,表示前面的字符要重复的次数

grep 'o\{2\}' /etc/passwd  匹配o出在过2次的某段字符. 里面用到了\拖意符号
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spoonl/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spooooooooonl/mail:/sbin/nologin

花括号表示前面字符的重复范围,花括号在使用的时候就是这样用的。 脱义符号用起来很麻烦,这里就可以用到-E的选项,或者是egrep。

3.7 使用egrep可以代替grep的所有命令

grep -E 'o{2}' /etc/passwd passwd
egrep 'o{2}' /etc/passwd

4. egrep命令

egrep命令是grep的扩展版本,但是实际工作中,只用会一种就够用了。

4.1 筛选一个或一个以上前面的字符

egrep 'o+' /etc/passwd

4.2 筛选零个或一个前面的字符

egrep 'oo?' /etc/passwd

4.3 筛选字符串1或者字符串2

中间有一个‘|’表示或者的意思,这个用的比较多

egrep 'root|nologin' /etc/passwd

4.4 egrep中‘( )’的应用

用‘( )’表示一个整体,例如(oo)+就表示1个‘oo’或者多个‘oo’

egrep '(oo){2}' /etc/passwd

4.5. 总结字符用法

'.'    任意一个字符,包括特殊字符,下划线,空格,
'*'    0个或者多个 *前面的字符
'.*'    任意数量任意字符,包括空行
'+'    表示1个或多个 + 前面的字符    (限egrep)
'?'    表示0个或1个 ?前面的字符        (限egrep)
[]  范围内任意一个字符
{}  
^    []里表示取反,外面表示行首

==# () { } | + ?这些符号用的时候需要用egrep或者用grep -E 或者用grep要配合用\脱义==

扫描二维码关注公众号,回复: 764497 查看本文章

5 . 扩展

--include 指定文件

grep 其实还可以这样使用:
在tmp目录下,过滤所有 *.txt 文档中含有root的行
grep -r --include="*.txt" 'root' /
data目录下,所有 *.php 文档中包含eval的行
egrep -rhn --include="*.php" 'eval' 1.txt 

猜你喜欢

转载自my.oschina.net/zhouyuntai/blog/1788851