grep


grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。

命令说明

将符合样式的该行列出

语法grep [options]

参数

-A NUM  除了列出符合行之外,并且列出后NUM

-a        可将二进制档案视为文本文件搜寻

-B NUM  -A NUM行对,但此参数是显示符合行之外并显示在它之前的NUM

-C [NUM],-NUM :列出符合行之外并列出上下各NUM行,默认是2

-b        :列出样式之前的内文总共有多少byte

-c        :不显示符合样式行,只显示符合的总行数

-d ACTION :若输入的档案是一个资料夹,使用ACTION去处理这个资料夹

预设ACTIONread(读取),此资料夹会被视为一般的档案

ACTIONskip(略过),资料夹会被grep略过

ACTIONrecurse(递归),grep会去读取资料夹下所有的档案相当于-r

-E        :采用规则表示式去解释样式

-e PATIERN :把样式作为一个partern,通常用在避免partern-开始

-f FILE    :事先将要搜寻的样式写入到一个档案,一行一个样式,然后采用档案搜寻

空的档案表示没有要搜寻的样式,因此也就不会有任何符合

-G        :将样式视为基本的规则表示式解释(此为预设)

-H        :在每个符合样式行前加上符合的文件名称,若有路径会显示路径

-h        :与-H参数相类似,但在输出时不显示路径

-I         grep会强制认为此二进制档案没有包含任何搜寻样式

-i         :忽略大小写,包含要搜寻的样式及被搜寻的档案

-L        :不显示平常一般的输出结果,反而显示出没有符合的文件名称

-l         :不显示平常一般的输出结果,只显示符合的文件名称

-n        :在显示行前面,标上行号

-q        :不显示任何的一般输出

-R        :递归的,读取每个资料夹下的所有档案

-s        :不显示关于不存在或无法读取的错误讯息

-v        :显示除搜寻样式行之外的全部

-x        :将搜寻样式视为一行去搜寻,完全符合该“行”的行才会被列出

主要参数

[options]主要参数:

c:只输出匹配行的计数。计算找到‘查找字符串’的次数

i:不区分大小写(只适用于单字符)

h:查询多文件时不显示文件名。

l:查询多文件时只输出包含匹配字符的文件名。

n:显示匹配行及行号。

s:不显示不存在或无匹配文本的错误信息。

v:显示不包含匹配文本的所有行。

patern正则表达式主要参数:

\   :忽略正则表达式中特殊字符的原有含义

^   :匹配正则表达式的开始行

$   :匹配正则表达式的结束行

\<  :从匹配正则表达式的行开始

\>  :到匹配正则表达式的行结束

[ ]  :单个字符,如[A]A符合要求

[ - ] :范围,如[A-Z]AZ都符合要求

.:所有的单个字符

*   :有字符,长度可以为0

命令实践

[root@yubing ~]# last | grep 'root'   将含有root字符串的行显示出来

root     tty1                          Tue Apr 16 00:35   still logged in  

root     tty1                          Mon Apr 15 19:05 - crash  (05:28)    

root     pts/1        10.0.0.131       Mon Apr 15 02:20 - 03:33  (01:13)    

root     pts/1        10.0.0.131       Mon Apr 15 02:08 - 02:08  (00:00)    

root     pts/1        10.0.0.131       Mon Apr 15 02:00 - 02:07  (00:07)    

root     pts/0        10.0.0.131       Mon Apr 15 01:56 - crash  (17:08)    

root     pts/0        10.0.0.131       Mon Apr 15 01:49 - 01:56  (00:07)    

root     pts/0        10.0.0.131       Mon Apr 15 01:44 - 01:49  (00:04)    

root     tty1                          Mon Apr 15 01:38 - crash  (17:26)    

root     tty1                          Sat Apr 13 22:57 - crash (1+02:37)  

root     tty1                          Sat Apr 13 18:57 - crash  (03:59)    

[root@yubing ~]# last | grep -v 'root'    -v反向提取,将不含root的行过滤出来

yubing   pts/0        10.0.0.131       Tue Apr 16 00:36   still logged in  

reboot   system boot  2.6.18-194.el5   Tue Apr 16 00:33          (00:04)    

yubing   pts/0        10.0.0.131       Mon Apr 15 19:05 - crash  (05:28)    

reboot   system boot  2.6.18-194.el5   Mon Apr 15 19:05          (05:33)    

yubing   pts/1        10.0.0.131       Mon Apr 15 03:43 - 03:50  (00:07)    

yubing   pts/1        10.0.0.131       Mon Apr 15 03:34 - 03:43  (00:08)    

reboot   system boot  2.6.18-194.el5   Mon Apr 15 01:36          (23:01)    

reboot   system boot  2.6.18-194.el5   Mon Apr 15 01:35          (23:03)    

reboot   system boot  2.6.18-194.el5   Sat Apr 13 22:57         (2+01:41)  

reboot   system boot  2.6.18-194.el5   Sat Apr 13 18:50         (2+05:48)  

wtmp begins Sat Apr 13 18:50:02 2013

[root@yubing ~]# last | grep 'root' | cut -d '' -f1   ‘’中间没加空格,所以没显示

root     tty1                          Tue Apr 16 00:35   still logged in  

root     tty1                          Mon Apr 15 19:05 - crash  (05:28)    

root     pts/1        10.0.0.131       Mon Apr 15 02:20 - 03:33  (01:13)    

root     pts/1        10.0.0.131       Mon Apr 15 02:08 - 02:08  (00:00)    

root     pts/1        10.0.0.131       Mon Apr 15 02:00 - 02:07  (00:07)    

root     pts/0        10.0.0.131       Mon Apr 15 01:56 - crash  (17:08)    

root     pts/0        10.0.0.131       Mon Apr 15 01:49 - 01:56  (00:07)    

root     pts/0        10.0.0.131       Mon Apr 15 01:44 - 01:49  (00:04)    

root     tty1                          Mon Apr 15 01:38 - crash  (17:26)    

root     tty1                          Sat Apr 13 22:57 - crash (1+02:37)  

root     tty1                          Sat Apr 13 18:57 - crash  (03:59)    

[root@yubing ~]# last | grep 'root' | cut -d ' ' -f1     加了空格才过滤了

root

root

root

root

root

root

root

root

root

root

root

[root@yubing ~]# grep 'MANPATH' /etc/man.config  取出/etc/man.config内含MANPATH的那几行

# when MANPATH contains an empty substring), to find out where the cat

# MANPATH               manpath_element [corresponding_catdir]

# MANPATH_MAP           path_element    manpath_element

# Every automatically generated MANPATH includes these fields

MANPATH /usr/man

MANPATH /usr/share/man

MANPATH /usr/local/man

MANPATH /usr/local/share/man

MANPATH /usr/X11R6/man

# MANPATH       /opt/*/man

# MANPATH       /usr/lib/*/man

# MANPATH       /usr/share/*/man

# MANPATH       /usr/kerberos/man

# Set up PATH to MANPATH mapping

MANPATH_MAP     /bin                    /usr/share/man

MANPATH_MAP     /sbin                   /usr/share/man

MANPATH_MAP     /usr/bin                /usr/share/man

MANPATH_MAP     /usr/sbin               /usr/share/man

MANPATH_MAP     /usr/local/bin          /usr/local/share/man

MANPATH_MAP     /usr/local/sbin         /usr/local/share/man

MANPATH_MAP     /usr/X11R6/bin          /usr/X11R6/man

MANPATH_MAP     /usr/bin/X11            /usr/X11R6/man

MANPATH_MAP     /usr/bin/mh             /usr/share/man

[root@yubing ~]#

[root@yubing ~]# dmesg | grep 'eth' 列出内核,找出内含eth的那几行

e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection

e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None

eth0: no IPv6 routers present

[root@yubing ~]# dmesg | grep -n --color=auto 'eth'   加上行号并显色

547:e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection

571:e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None

575:eth0: no IPv6 routers present

[root@yubing ~]# dmesg | grep -n -A3 -B2 --color=auto 'eth'  前两行与后三行也显示出来

545-PCI: Setting latency timer of device 0000:02:01.0 to 64

546-e1000: 0000:02:01.0: e1000_probe: (PCI:66MHz:32-bit) 00:0c:29:aa:91:8c

547:e1000: eth0: e1000_probe: Intel(R) PRO/1000 Network Connection

548-input: PC Speaker as /class/input/input4

549-piix4_smbus 0000:00:07.3: Found 0000:00:07.3 device

550-piix4_smbus 0000:00:07.3: Host SMBus controller not enabled!

--

569-EXT3-fs: mounted filesystem with ordered data mode.

570-Adding 1052248k swap on /dev/sda2.  Priority:-1 extents:1 across:1052248k

571:e1000: eth0 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None

572-NET: Registered protocol family 10

573-lo: Disabled Privacy Extensions

574-IPv6 over IPv4 tunneling driver

575:eth0: no IPv6 routers present

[root@yubing ~]#

grep -n ‘t[ae]st’ regular.txt

要查找的是tasttest两个字符

grep -n ‘oo’ regular.txt

查找有oo的字符,只要含有oo都会显示

grep -n ‘[^g]oo’ regula.txt

   [^]集合字符的反向选择,不想要oo前面有g

grep -n ‘[^a-z]oo’ regular.txt

 oo前面不要有小写字符

grep -n ‘[0-9]’ regular.txt

查找有数字的那一行

grep -n ‘^the’ regular.txt

the开头

grep -n ‘^[a-z]’ regular.txt

开头是小写字符的那一行

grep -n ‘^[a-zA-Z]’ regular.txt

不要开头是英文字母

grep -n ‘\.$’ regular,txt

行尾结束为小数点的那一行

小数点是有其他意义,必须要使用转义字符 \ 来加以解除其特殊意义

grep -n ‘^$’ regular.txt

找出哪一行是空白行

grep -v ‘^$’ /etc/svslog.conf | grep -v “^#”

不要空白行,也不要开头是#的那一行

^符号在[ ]内代表反向选择,在[ ]外则代表定位在行首的意思

.(小数点):代表一定有一个任意字符的意思

*(星号):代表重复前一个0到无穷多次的意思,为组合形态

grep -n ‘g..d’ regular.txt

grep -n ‘o*’ regular.txt

 *代表的是重复0个或多个前面的RE字符的意义,因此“o*”代表的是具有空字符或一个o以上的字符

grep -n ‘ooo*’ regular.txt

需要至少两个o以上的字符串时,就需要ooo*

grep -n ‘goo*g’ regular.txt

因为{与}的字符在shell是有特殊意义的,必须使用转义字符来让它失去特殊意义

grep -n ‘o\{2\}’ regular.txt   找到两个o的字符串

grep -n ‘go\{2,5\}g’ regular.txt   2-5o

grep -n ‘go\{2,\}g’ regular.txt     2个以上