grep和正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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行举例
[[email protected] ~]# 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的行
[[email protected] ~]# egrep ‘root‘ passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin


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


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


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


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


过滤带有amd开头的行
[[email protected] ~]# 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


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


匹配以0-9开头的行
[[email protected] ~]# egrep ‘^[0-9]‘ passwd


匹配带有r或ro的行
[[email protected] ~]# 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次的行
[[email protected] ~]# echo ‘111111‘ >>passwd
[[email protected] ~]# echo ‘2222222‘ >>passwd
[[email protected] ~]# echo ‘3333333‘ >>passwd
[[email protected] ~]# egrep ‘^[0-9]6‘ passwd
111111
2222222
3333333


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


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


过滤带有root或者是shut的行
[[email protected] ~]# 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到多次
[[email protected] ~]# egrep ‘3+‘ passwd
adm:x:3:4:adm:/var/adm:/sbin/nologin
3333333


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


过滤带有sH或者h的行
[[email protected] ~]# echo "sHutdown....." >> passwd
[[email protected] ~]# 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次的行
[[email protected] ~]# 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和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式与grep

grep家族和正则表达式

Linux基础--grep与正则表达式

grep和正则表达式

grep和正则表达式

正则表达式-grep工具常见选项的使用