grep命令

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了grep命令相关的知识,希望对你有一定的参考价值。

正则表达式
正则表达式就一串有规律的字符串,掌握好正则对写shell有很大的帮助,各种编程语言都有正则,原理都是一样的。

grep工具

grep是用来过滤指定关键词的命令,它的用法是grep +参数【-cinvrABC】+‘关键词’+文件名,这里我们要注意的是过滤的关键词要用单引号‘’去括起来。
grep的参数是可以组合使用的。

grep -c 行数
[[email protected] grep]# grep -c ‘nologin‘ passwd
16

grep -n 显示行号
[[email protected] grep]# grep -n ‘nologin‘ passwd | head -5
2:bin:x:1:1:bin:/bin:/sbin/nologin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

grep -i 不区分大小写
[[email protected] grep]# grep -in ‘nologin‘ passwd |head -5
2:bin:x:1:1:bin:/bin:/sbin/NOlogin
3:daemon:x:2:2:daemon:/sbin:/sbin/nologin
4:adm:x:3:4:adm:/var/adm:/sbin/nologin
5:lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
9:mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
这样就不区分大小写,直接把关键词过滤出来。

grep -v 取反,把除了关键词的其他部分过滤出来
[[email protected] grep]# grep -v ‘nologin‘ passwd |head -4
root:x:0:0:root:/root:/bin/bash
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
这样就把除了‘nologin’的其余部分给过滤出来了。

grep -r 遍历所有子目录

grep -A 过滤出符合要求的行以及下面n行
比如我们要过滤符合要求的行以及下面两行
[[email protected] grep]# grep -nA2 ‘root‘ passwd
1:root:x:0:0:root:/root:/bin/bash
2-bin:x:1:1:bin:/bin:/sbin/NOlogin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

grep -B 过滤出符合要求的行以及上面n行
比如我们要过滤符合要求的行以及上面的两行
[[email protected] grep]# grep -nB2 ‘root‘ passwd
1:root:x:0:0:root:/root:/bin/bash(由于它是第一行,上面没有内容了,所以只显示一行)

8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin

grep -c 过滤出符合要求的行以及上下个n行
比如我们要过滤符合要求的行以及上下的两行
[[email protected] grep]# grep -nC2 ‘root‘ passwd
1:root:x:0:0:root:/root:/bin/bash(由于是第一行,所以只匹配了下面两行)
2-bin:x:1:1:bin:/bin:/sbin/NOlogin
3-daemon:x:2:2:daemon:/sbin:/sbin/nologin

8-halt:x:7:0:halt:/sbin:/sbin/halt
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10:operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12-ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

grep示例
过滤数字
[[email protected] grep]# grep ‘[0-9]‘ passwd | head -5
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
0-9是一个范围【】里是任意一个字符,只要里面有数字,就符合我们的要求。

以某个字符开头的行,‘^ ’。
比如我们要过滤以#开头的行
[[email protected] grep]# grep -n ‘^#‘ inittab |head -5,如果不已#号开头,则加参数v
1:# inittab is no longer used when using systemd.
2:#
3:# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
4:#
5:# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

不以#开头
[[email protected] grep]# grep -nv ‘^#‘ inittab |head -5
8:&(&(&
11:aaaaaa
14: sdjflksjdfkljskgjsd
16:111111111111111

*我们以后会看很多服务相关的配置文件,而服务相关的配置文件有很多都已#开头,看起来比较乱,所以我们就用这种方法,开起来就很方便了。

在中括号中加^,是非的意思,也就是只要不是【】里面的就都显示出来。
比如我们不选取含有数字的内容,就是【^0-9】,他会将选取的内容用不同颜色表示出来。这里我们是排出了数字。
技术分享图片
匹配的是红色字符,不匹配的是白色字符。
还有这种用法^[^],只要不是方括号里面内容所开头的,都显示出来。比如^[^0-9]
技术分享图片
这就是以不是数字的字符开头

$:以xx结尾。比如,我们要以in结尾,就可以输入‘in$’
[[email protected] grep]# grep ‘in$‘ passwd |tail -3
sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
apache:x:48:48:Apache:/usr/share/httpd:/sbin/nologin

^$:代表空行

‘.’代表且只能代表一个字符
[[email protected] grep]# grep ‘r.o‘ passwd
root:x:0:0:root:/root:/bin/bash
2222222:r.o:lgfkdg;lkdfl
operator:x:11:0:operator:/root:/sbin/nologin

’重复前面字符0次或者n次
[[email protected] grep]# grep ‘o
o‘ passwd
root:x:0:0:root:/root:/bin/bash
skdjfklsjdgkljdfkjg123165454:geo:444:qwewq11$%^^
bin:x:1:1:bin:/bin:/sbin/NOlogin
2222222:r.o:lgfkdg;lkdfl
daemon:x:2:2:daemon:/sbin:/sbin/nologin

‘.’通配符,他会匹配所有的字符,甚至包括空行
如果我想匹配文档中某一行,只要敲出开头的字符,然后中间用.
去代替,然后再敲上结尾,就可以了
比如我们要匹配aming这一行,只要输入‘aming.bash‘就可以匹配出来。
[[email protected] grep]# grep ‘aming.
bash‘ passwd
aming:x:1001:1001::/home/aming:/bin/bash

‘\’脱意符,让符号还原本来的意义。
比如我们要匹配文档中的o字符,输入o{2},其中{}表示范围,而\是将{}脱意,否则系统不会识别{}。
[[email protected] grep]# grep ‘o{2}‘ passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo(最后一行这个6个o匹配,是因为我们在前面命令中提到o出现2次,而这行是连续2个o出现三次,所以可以匹配到)

有时候我们输入脱意符的时候会感觉很麻烦,这时我们也可以输入egrep或者grep -E,这样就不用输入脱意符了,
egrep=grep -E

我们还用刚才的那个例子
[[email protected] grep]# egrep o{2} passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo

[[email protected] grep]# grep -E o{2} passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo

‘+’它的作用类似于‘’号,它的意义是前面的字符出现1次或者多次,它和‘’号的区别在于‘*’有0次,而‘+’没有0次。在用‘+’号 的时候我们一定要将它脱意,如果我不想脱意就用egrep或者grep -E

[[email protected] grep]# grep ‘o+o‘ passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo

[[email protected] grep]# egrep ‘o+o‘ passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo

[[email protected] grep]# grep -E ‘o+o‘ passwd
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
operator:x:11:0:operator:/root:/sbin/nologin
postfix:x:89:89::/var/spool/postfix:/sbin/nologin
oooooo

?:表示?前面的字符重复0次或1次,要么有,要么就没有。如果?前面没有可匹配的字符,那么就直接显示后面的字符。我们拿o+t做个例子
[[email protected] grep]# grep -E ‘o?t‘ passwd |head -3
root:x:0:0:root:/root:/bin/bash
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt

|:表示或者的意思,使用‘|’配合egrep或者grep -E来使用会比较方便,如果不用,就要在‘|’前面加‘\’脱意。他可以分割多个。
比如我们来过滤root或者是nologin
[[email protected] grep]# grep ‘root|nologin‘ passwd |head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[[email protected] grep]# grep -E ‘root|nologin‘ passwd |head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

[[email protected] grep]# egrep ‘root|nologin‘ passwd |head -3
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin

():将我们需要过滤的内容括起来,后面跟{},里面填写一个数字,是重复的次数。我们用oo来做一个测试,然后过滤重复两次的字符
[[email protected] grep]# egrep ‘(oo){2}‘ passwd
ooooo

以上是关于grep命令的主要内容,如果未能解决你的问题,请参考以下文章

linux命令grep

shell编程之grep命令和egrep命令:行截取命令

小猿圈之Linux使用grep筛选多个条件及grep常用过滤命令

Linux下find命令和grep命令查找文件

shell命令--grep/egrep

grep命令