文本处理grep
1、基本使用
1.1 常用选项
-c 只输出匹配行的计数
-i 不区分大小写
-l 查询多文件时只输出包含匹配字符的文件名
-n 显示匹配行及行号
-s 不显示错误信息
-v 显示不包含匹配文本的所有行
-q 用于shell中if判断,不显示任何信息。
-o 只显示匹配到的内容
\<var 以var开头的单词
var\> 以var结尾的单词
\<var>\ 匹配var为单词的行,除字母|数字|下划线外都可以做单词的分隔符
注:匹配的字符串或变量用双引号,模式匹配用单引号。
1.2 示例
- 可匹配到的行数
[root@netposa13501206 ~]# cat 1.log
abc wfe 133 fwef
abcd ewd 21r2 1323r
abd asf e2dd 469
AbC ewf ws 3rt
aBC er2 444t5
[root@netposa13501206 ~]# grep -c "abc" 1.log
2
- 显示行号
[root@netposa13501206 ~]# grep -n "abc" 1.log
1:abc wfe 133 fwef
2:abcd ewd 21r2 1323r
- 反向匹配
[root@netposa13501206 ~]# grep -n -v "abc" 1.log
3:abd asf e2dd 469
4:AbC ewf ws 3rt
5:aBC er2 444t5
- 精准匹配
#匹配以abc为单词结尾的行
[root@netposa13501206 ~]# grep -n "\<abc\>" 1.log
1:abc wfe 133 fwef
- 不区分大小写
[root@netposa13501206 ~]# grep -n -i "abc" 1.log
1:abc wfe 133 fwef
2:abcd ewd 21r2 1323r
4:AbC ewf ws 3rt
5:aBC er2 444t5
2、正则表达式
2.1 模式范围
# 精确匹配abc或者abd为单词所在的行
[root@netposa13501206 ~]# grep -n '\<ab[cd]\>' 1.log
1:abc wfe 133 fwef
3:abd asf e2dd 469
2.2 不匹配行首
# 显示行首不是a开头的行
[root@netposa13501206 ~]# grep -n '^[^a]' 1.log
4:AbC ewf ws 3rt
2.3 匹配任意字符
# 匹配3个字符组成的字符串,第一个为任意大写字符,最后一个为大写字母C,中间为任意1个字符
[root@netposa13501206 ~]# grep -n '[A-Z].C' 1.log
4:AbC ewf ws 3rt
2.4 日期匹配
# 匹配以3开头、随后跟2个任意字符、再跟199、最后一位是6或者7的7位字符串
[root@netposa13501206 ~]# cat 2.log
48 Dec 3BC1997 LPSX 68.00 LVX2A
483 Sep 5AP1996 USP 65.00 LVX2C
47 Oct 3ZL1998 LPSX 43.00 KVM9D
219 Dec 2CC1999 CAD 23.00 PLV2C
483 Nov 7PL1996 CAD 49.00 PLV2C
483 May 5PA1998 USP 37.00 KVM9D
216 Sep 3ZL1998 USP 86.00 KVM9E
[root@netposa13501206 ~]# grep -n '3..199[6,7]' 2.log
1:48 Dec 3BC1997 LPSX 68.00 LVX2A
# 查询包含1996的所有行
[root@netposa13501206 ~]# grep -n '[0-9]\{3\}[6]' 2.log
2:483 Sep 5AP1996 USP 65.00 LVX2C
5:483 Nov 7PL1996 CAD 49.00 PLV2C
2.5 范围组合
# 查询行首为3个数字,第一个小于4、第二个为1、第三个小于8
[root@netposa13501206 ~]# grep -n '^[0-3][1][0-7]' 2.log
7:216 Sep 3ZL1998 USP 86.00 KVM9E
2.6 模式出现几率
# 至少出现2次9
[root@netposa13501206 ~]# grep '9\{2,\}' 2.log
48 Dec 3BC1997 LPSX 68.00 LVX2A
483 Sep 5AP1996 USP 65.00 LVX2C
47 Oct 3ZL1998 LPSX 43.00 KVM9D
219 Dec 2CC1999 CAD 23.00 PLV2C
483 Nov 7PL1996 CAD 49.00 PLV2C
483 May 5PA1998 USP 37.00 KVM9D
216 Sep 3ZL1998 USP 86.00 KVM9E
# 出现3次9
[root@netposa13501206 ~]# grep '9\{3\}' 2.log
219 Dec 2CC1999 CAD 23.00 PLV2C
# 出现2~6次8,并以3结尾
[root@netposa13501206 ~]# cat 3.log
83
888883
8884
88883
[root@netposa13501206 ~]# grep -n '8\{2,6\}[3]' 3.log
2:888883
4:88883
2.7 grep的“与”、“或”
# 与的用法。483开头并且包含"Sep"字符串
[root@netposa13501206 ~]# grep '^483' 2.log | grep "Sep"
483 Sep 5AP1996 USP 65.00 LVX2C
# 或的用法。以483开头或者D开头2个小写字母为单词的行
[root@ly ~]# grep "\<D[a-z]\{2\}\>\|^\(483\)" 2.log
48 Dec 3BC1997 LPSX 68.00 LVX2A
483 Sep 5AP1996 USP 65.00 LVX2C
219 Dec 2CC1999 CAD 23.00 PLV2C
483 Nov 7PL1996 CAD 49.00 PLV2C
483 May 5PA1998 USP 37.00 KVM9D
2.8 空行
# 显示非空行
[root@netposa13501206 ~]# cat 4.log
83
888883
8884
88883
[root@netposa13501206 ~]# grep -v '^$' 4.log
83
888883
8884
88883
2.9 特殊字符
$ . ' " * [] ^ | \ + ?,必须在特定字符前加\
2.10 匹配文件名
# 匹配最多6个小写字符,后跟句点,再接两个大写字符
[root@netposa13501206 ~]# cat 6.log
yrend.AS
mothdf
soa.PP
qp.RR
[root@netposa13501206 ~]# grep '^[a-z]\{1,6\}\.[A-Z]\{2\}' 6.log
yrend.AS
soa.PP
qp.RR
2.11 \1用法
# 第一个模式匹配的串,同理\2为第二个
[root@ly ~]# cat f1
abc2bcd3abcd5fwega
234fewg123
234ewgw23gr234yrh
[root@ly ~]# grep "\(abc\).*\1" f1
abc2bcd3abcd5fwega
[root@ly ~]# grep "\([0-9]\{3\}\).*\1" f1
234ewgw23gr234yrh
2.12 ifconfig中找出ip
[root@ly ~]# ifconfig
enp0s3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.1.207 netmask 255.255.255.0 broadcast 192.168.1.255
inet6 fe80::5cd8:2c98:2c51:3b1a prefixlen 64 scopeid 0x20<link>
inet6 240e:342:1730:c800:ca86:33e7:c22c:3d9d prefixlen 64 scopeid 0x0<global>
ether 08:00:27:35:9e:0c txqueuelen 1000 (Ethernet)
RX packets 1837 bytes 208995 (204.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 1275 bytes 185412 (181.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 32 bytes 2592 (2.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 32 bytes 2592 (2.5 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
# 只显示ip地址并过滤127和255开头
[root@ly ~]# ifconfig | grep -o '[1-9]\{1,3\}\(\.[0-9]\{1,3\}\)\{3\}' | grep -v '^\(255\)\|^\(127\)'
192.168.1.207
192.168.1.255