文本处理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
posted @ 2020-11-10 15:31  那就这样吧~  阅读(198)  评论(0编辑  收藏  举报