Linux学习(二十三)正则表达式(一)grep/egrep

一、概述

正则表达式是运维工作中经常需要用到的知识。文件查找,日志分析,rewrite规则,shell脚本等等,都需要正则表达式的知识。那么什么是正则表达式呢?我的理解就是,按照一定的规则找到或者替换你需要的字符串,这个规则就是正则表达式,准确的讲,它就是一个规则。使用正则表达式的命令有很多,我们今天讲到的grep和egrep就是最常用的。此外还有sed、awk,我们会在后续接着讲到。

二、grep/egrep

egrep是grep的增强版,grep能实现的egrep都能实现,而且在某些地方,使用egrep更加方便。下面就具体讲一下这两个命令。

语法: grep  [-cinvABC]  'word'  filename

-c :打印符合要求的行数

-i :忽略大小写

-n :在输出符合要求的行的同时连同行号一起输出

-v :打印不符合要求的行

-A :后跟一个数字(有无空格都可以),例如 –A2则表示打印符合要求的行以及下面两行

-B :后跟一个数字,例如 –B2 则表示打印符合要求的行以及上面两行

-C :后跟一个数字,例如 –C2 则表示打印符合要求的行以及上下各两行

实验:

-c

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -c 'oo' a.txt
6

-i

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep --color -i 'OO' a.txt
root:x:0:0:root:/root:/bin/bash
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin

--color选项的意思是高亮显示搜索到的内容:

-n

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -n 'oo' a.txt
1:root:x:0:0:root:/root:/bin/bash
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
11:operator:x:11:0:operator:/root:/sbin/nologin
21:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

-v

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -v 'oo' a.txt|head -n 3
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

-A

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -A2 -n 'li\.jianlin' a.txt
93:li.jianlin:x:7202:7022::/home/li.jianlin:/bin/bash

因为93行是最后一行,所以只显示了折行

-B

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -B2 -n 'li\.jianlin' a.txt
91-wang.xishuai:x:7200:7022::/home/wang.xishuai:/bin/bash
92-han.xinyu:x:7201:7022::/home/han.xinyu:/bin/bash
93:li.jianlin:x:7202:7022::/home/li.jianlin:/bin/bash

-C

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -C1 -n 'xishuai' a.txt
90-xiong.zhengmao:x:7199:7022::/home/xiong.zhengmao:/bin/bash
91:wang.xishuai:x:7200:7022::/home/wang.xishuai:/bin/bash
92-han.xinyu:x:7201:7022::/home/han.xinyu:/bin/bash

特殊字符“.”

特殊字符.表示任意字符

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep --color '7.22' a.txt
mabg:x:7032:7022::/home/mabg:/bin/bash
zhongwt:x:7038:7022::/home/zhongwt:/bin/bash

.*表示任意数量的任意字符(可以包含空行)

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep '.*' a.txt|wc -l
93

可见使用.*查找到了所有的行。

?表示没有,或者有1个

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep "n?" a.txt
[ruan.wenwu@kddi-zol-fss-web1 test]$ grep "n\?" a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[ruan.wenwu@kddi-zol-fss-web1 test]$ egrep 'n?' a.txt|headn -n3
-bash: headn: command not found
[ruan.wenwu@kddi-zol-fss-web1 test]$ egrep 'n?' a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

从上面的例子我们能发现,使用grep不能直接判断出特殊符号?,而需要转义,但是用egrep不需要转义。

除了?之外,egrep还支持+(表示一个或者多个):

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep 'o+' a.txt|head -n3
[ruan.wenwu@kddi-zol-fss-web1 test]$ egrep 'o+' a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[ruan.wenwu@kddi-zol-fss-web1 test]$ grep 'o\+' a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

正则表达式中使用()来表示一个整体:

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep '(oo|ol)' a.txt
[ruan.wenwu@kddi-zol-fss-web1 test]$ egrep '(oo|ol)' a.txt|head -n3
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin

grep还可以在指定的文件或者目录中搜索相关的行:

[ruan.wenwu@kddi-zol-fss-web1 test]$ grep -r --include='*.txt' 'oo\+' ./
./a.txt:root:x:0:0:root:/root:/bin/bash
./a.txt:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
./a.txt:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
./a.txt:uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
./a.txt:operator:x:11:0:operator:/root:/sbin/nologin
./a.txt:postfix:x:89:89::/var/spool/postfix:/sbin/nologin

-r是递归搜索的意思,--include="*.txt"是指搜索.txt结尾的文件。注意使用grep的时候,如果正则里用到+号,需要转义。

转载于:https://www.cnblogs.com/doubilaile/p/7865176.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值