grep和正则表达式

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

转载于:https://blog.51cto.com/13760226/2411250

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值