码迷,mamicode.com
首页 > 其他好文 > 详细

grep和正则表达式

时间:2019-06-19 22:08:28      阅读:156      评论:0      收藏:0      [点我收藏+]

标签:完全   local   出现   shadow   sha   一个   上下文   with   mon   

grep和正则表达式

1、grep命令格式

grep [选项] pattern filename filename.....
 # grep ‘Tom‘ /etc/passwd
 # grep ‘bash shell’ /etc/passwd
找到:          grep返回的退出状态为0
没找到:        grep返回的退出状态为1
找不到指定文件:grep返回的退出状态为2

grep程序的输入可以来自标准输入或管道,而不仅仅是文件,例如:
# grep ‘tom‘
# ps -aux | grep ‘sshd‘
# ll | grep ‘^d‘   #过滤目录
# egrep ‘^root’ /etc/passwd /etc/shadow /etc/group

2、grep选项

-i --ignore-case    忽略大小写
-l --file-with-matches  只列出匹配行所在的文件名
-n --line-number    在每一行前面加上它在文件中的相对行
-c --count          显示成功匹配的行数
-s --no-messages    禁止显示文件中不存在或文件不可读错误
-q --quiet,--silent 静默 --quiet    grep -q ‘root‘ /etc/passwd; echo $? 不输出结果
-v --invert-mach     反向查找,志向是不匹配的行
-R,-r  --recursive   递归针对目录
--color              颜色
-o --only-matching   只显示匹配的内容,而不是一整行
-B --before-context=NUM 输出前面几行的内容
-A --after-contest=NUM  输出后面几行的内容
-C --context=NUM        输出上下文几行的内容
-B -A -C 例如:
grep -A2 ‘root‘ /etc/passwd    #输出带root后两行
grep -B2 ‘test’ /etc/passwd    #输出带test前两行
grep -C2 ‘alice‘ /etc/passwd   #输出带alice上下两行
useradd --help | grep -C2 "\-c" 同上

3、grep使用的元字符

grep使用的基本元字符集: ^  $  .  *    []  [^]   \<\>   \(\)  \+  \|
^以什么开头
$以什么结尾
. 任意单个字符
* 匹配前面字符0~多次
[] 匹配其中的内容
[^] 不匹配其中的内容
\<\> 词首词尾定界符
\(\) 括号中的内容为一个组
\+ 匹配前面内容1~多次
 \|  或的关系

4、grep使用的扩展元字符

egrep(或grep -E):使用扩展元字符? + {} | ()
? 匹配0-1次 
匹配1-n次 
{n} 匹配前导内容多次 
| 或者的意思 
()其中的内容为一个组

5、grep示例

ps:不确定或者不想记是否为元字符还是扩展元字符,可以直接用egrep,通配。

#用/etc/passwd的前10行举例
[root@localhost ~]# head -10 /etc/passwd > passwd
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin


过滤带有root的行
[root@localhost ~]# egrep ‘root‘ passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


从p*文件中过滤带有root的字段
[root@localhost ~]# egrep ‘root‘ p*
passwd:root:x:0:0:root:/root:/bin/bash
passwd:operator:x:11:0:operator:/root:/sbin/nologin


过滤以r开头的行
[root@localhost ~]# egrep ‘^r‘ passwd
root:x:0:0:root:/root:/bin/bash


过滤带有sh结尾的行
[root@localhost ~]# egrep ‘sh$‘ passwd
root:x:0:0:root:/root:/bin/bash


过滤带有5.后面任意一个字符的行,\ 转义5后面的点
[root@localhost ~]# echo "sync:x:5.0aa" >>passwd
[root@localhost ~]# egrep ‘5..‘ passwd
sync:x:5.0aa


过滤带有amd开头的行
[root@localhost ~]# egrep ‘^[amd]‘ passwd
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin


匹配完全符合的行,混合内容不会被去除
[root@localhost ~]# egrep ‘[^root:x:0:0:root:/root:/bin/bash]‘ passwd
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
......


匹配带有0-9的行
[root@localhost ~]# egrep ‘[0-9]‘ passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
........


匹配以0-9开头的行
[root@localhost ~]# egrep ‘^[0-9]‘ passwd


匹配带有r或ro的行
[root@localhost ~]# egrep ‘ro*‘ passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin


匹配0-9至少出现3次的行
[root@localhost ~]# echo ‘111111‘ >>passwd
[root@localhost ~]# echo ‘2222222‘ >>passwd
[root@localhost ~]# echo ‘3333333‘ >>passwd
[root@localhost ~]# egrep ‘^[0-9]{6}‘ passwd
111111
2222222
3333333


过滤词首词尾为sync的行,可以拆开来使用\<词首 \>词尾
[root@localhost ~]# egrep ‘\<sync\>‘ passwd
sync:x:5:0:sync:/sbin:/bin/sync
sync:x:5.0aa


过滤词首为组中(shut),并且中间任意字符匹配多次,最后为n的行
[root@localhost ~]# egrep ‘\<(shut).*n‘ passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown


过滤带有root或者是shut的行
[root@localhost ~]# egrep ‘root|shut‘ passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
operator:x:11:0:operator:/root:/sbin/nologin


匹配带3的行1到多次
[root@localhost ~]# egrep ‘3+‘ passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
3333333


过滤r后面是a或者o的行
[root@localhost ~]# egrep ‘r(a|o)‘ passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


过滤带有sH或者h的行
[root@localhost ~]# echo "sHutdown....." >> passwd
[root@localhost ~]# egrep ‘sH|h‘ passwd
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
sHutdown.....


过滤r或者ro后一个字符出现0-1次的行
[root@localhost ~]# egrep ‘ro?‘ passwd
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin

grep和正则表达式

标签:完全   local   出现   shadow   sha   一个   上下文   with   mon   

原文地址:https://blog.51cto.com/13760226/2411250

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!