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和正则表达式的主要内容,如果未能解决你的问题,请参考以下文章