grep是linux中使用最广泛的命令之一。它对文本按给定模式进行查找,如果找到匹配模式,就打印匹配模式的所有行。
1.grep的一般格式
调用字符串或变量时,应该使用双引号将其括起来;调用模式匹配时,应该使用单引号。
2.grep的选项
常用选项有:
-c 只输出匹配成功的行数
-i 不区分大小写
-h 查询多文件时不显示文件名。
-l 查询多文件时只输出包含匹配字符的文件
-n 显示匹配行及行号。
-s 不显示不存在或无匹配文本的错误信息。
-v 显示不包含匹配文本的所有行。
3.简单应用
在接下来的
实例,若命令行中有data文件,则其内容(只有第2和6行是空行)如下:
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
216 sept 3ZL1998 USP 89.00 KVM9E 234
4834 sept 2XL1992 USP 56.00 KEX9D 562
----end of file-----
(1)查找data文件中有几行包含数字48
[root@RHEL5 shell]# grep -c "48" data
5
[root@RHEL5 shell]# grep "48" data
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
483 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
4834 sept 2XL1992 USP 56.00 KEX9D 562
(2)显示行号
[root@RHEL5 shell]# grep -n "47" data
4:47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
(3)显示非匹配行
[root@RHEL5 shell]# grep -v "48" data
47 Oct 3ZL1998 LPSX 43.00 KVM9D 512
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 89.00 KVM9E 234
(4)精确匹配
使用grep抽取精确匹配行是在被抽取字符串后加\>
[root@RHEL5 shell]# grep "48\>" data
48 Dec 3BC1997 LPSX 68.00 LVX2A 138
(5)大小写不敏感
[root@RHEL5 shell]# grep -i "sePt" data
483 Sept 5AP1996 USP 65.00 LVX2C 189
216 sept 3ZL1998 USP 89.00 KVM9E 234
4834 sept 2XL1992 USP 56.00 KEX9D 562
4.grep和正则表达式组合使用
(1)模式范围
抽取代码为484和483的城市位置:
[root@RHEL5 shell]# grep '48[34]' data
483 Sept 5AP1996 USP 65.00 LVX2C 189
484 nov 7PL1996 CAD 49.00 PLV2C 234
483 may 5PA1998 USP 37.00 KVM9D 644
4834 sept 2XL1992 USP 56.00 KEX9D 562
(2)不匹配首行
抽取首行不是48的行:
[root@RHEL5 shell]# grep '^[^48]' data
219 dec 2CC1999 CAD 23.00 PLV2C 68
216 sept 3ZL1998 USP 89.00 KVM9E 234
(3)匹配任意字符
抽取头2个是大写字母,中间是2个任意字符,并以C结尾:
[root@RHEL5 shell]# grep '[A-Z][A-Z]..C' data
483 Sept 5AP1996 USP 65.00 LVX2C 189
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
(4)日期查询
抽取以5开始,后接2个任意字符,并以1996或1998结尾的行:
[root@RHEL5 shell]# grep '5..199[6,8]' data
483 Sept 5AP1996 USP 65.00 LVX2C 189
483 may 5PA1998 USP 37.00 KVM9D 644
(5)范围组合
以行首开始,第一个字符是0-9,第二个是0-5,第三个是0-6:
[root@RHEL5 shell]# grep '^[0-9][0-5][0-6]' data
216 sept 3ZL1998 USP 89.00 KVM9E 234
(6)模式出现几率
抽取数字4至少重复出现2次的行:
[root@RHEL5 shell]# grep '4\{2,\}' data
483 may 5PA1998 USP 37.00 KVM9D 644
抽取数字9只重复出现3次的行:
[root@RHEL5 shell]# grep '9\{3\}' data
219 dec 2CC1999 CAD 23.00 PLV2C 68
抽取9重复出现2次或3次,并以2个任意字符加CAD结尾的行:
[root@RHEL5 shell]# grep '9\{2,3\}..CAD' data
219 dec 2CC1999 CAD 23.00 PLV2C 68
484 nov 7PL1996 CAD 49.00 PLV2C 234
(7)抽取空行
[root@RHEL5 shell]# grep -n '^$' data
2:
6:
(8)使用ps
[root@RHEL5 shell]# ps -aux | grep "events"
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
root 8 0.0 0.0 0 0 ? S< Oct14 0:58 [events/0]
root 9 0.0 0.0 0 0 ? S< Oct14 0:01 [events/1]
root 22927 0.0 0.1 61196 752 pts/2 S+ 08:08 0:00 grep events