Linux之grep

  1. 首先介绍一些特殊符号,仅列出常用的几个

注意:以中括号的形式,表示一个整体

grep用法讲解

grep (global search regular expression and print the line),以行为单位进行信息的提取和分析

[root@localhost ~]grep [-acinv] [--color=auto] '查找的字符串' filename

参数解析:

-a 将binary文件以text文件的方式查找数据

-c 计算找到   '查找字符串' 次数

-i 忽略大小写,所有的大小写视为一样

-n输出行号

-v 反向选择,即显示出没有  '查找字符串'  内容的那一行

--color=auto 将关键部分加上颜色显示,由于高亮提取的数据可以使人一目了然,因此为了永久有效,可以在 ~./bashrc  内容里修改,加上alias grep='grep --color=auto'


再以source命令使其立即生效



此外关于grep的还有的其他用法

[root @localhost ~]# grep  [-A]  [-B] [--color=auto] '查找字符串' filename 

参数解析:

-A 后面可以加数字,为after之意,-A5表示第5行到最后一行都会表示出来

-B 后面可以加数字,为befer之意,-B5,表示首行到第5行都会表示出来


表示关键字 'root'所在行的前2行与'root'所在行的后3行都会被显示出来

关于正则表达式的练习:

1、利用中括号  [ ]  查找字符集合

如果查找的 test 和 tast ,不难发现这个两个字符串的的区别是e和a,因此

[root @localhost tmp] # grep -n 't[ae]st' re.txt


关于 [] 里面无论有几个字符,都表示只取其中的一个字符

如果想查找 'oo' 的字符时,可以

[root @localhost tmp]# grep -n 'oo' re.txt

此时会找出所有含有oo的字符串的行并予以显示


如果不想要goo形式开头的字符串的行,可以

[root @localhost tmp]#grep -n '[^g]oo' re.txt

注意这里的不以 g 开头的字符串,是 [^g]的形式


这里10和11行中之所以还有goo 的形式,因为 oo 前还有o,即至少3个o

现在找出oo前无小写字母,使用反向选择字符 ^

[rrot @localhost tmp]# grep -n '[^a-z]oo' re.tx

或者:获取oo前无小写字母的形式

[root @localhost tmp] #grep -n '[^[:lower]]'oo' re.txt


对比行首字符 ^:

[root @localhost tmp] # grep -n '^[a-z]' re.txt
找出开头是小写字母+oo的形式

所以一定注意反向选取 ^ 和 行首字符 ^,这里个符合一样的,但是放置的位置不同,决定了其意义不同,在[^]表示反向选择,^[]表示行首的意思

在一组字符集合中,如果该字符是连续式,可以使用如[0-9][A-Z][a-z]等方式来书写

[root @localhost tmp]# grep -n '[0-9]' re.txt

当然也可以使用特殊字符表示方法

[root @localhost tmp] # grep -n '[[:digit:]]' re.txt



2、行尾字符 $

想要查找以 .为行尾的那一行

[root @localhost tmp] #grep -n '\.$' re.txt

注意这里之所以 \. ,是因为 . 还有其他含义,这里使用转义字符使其成为普通字符

显示空白行

[root @localhost tmp]# grep '^$' re.txt

3、任意一个字符 . 和重复字符*

在bash中,知道通配符* 可以用来表示0个或任意个字符,但是正则表达式不是通配符,两者之间是不同的,正则表达式中 “.”表示肯定有一个任意字符,* 表示重复前一个字符 0次或者多次,为组合形态

[rroot @localhost tmp]# grep -n 'g..d' re.txt

表示在字母g和d之前一定有两个字符


查找至少含有两个 o,即 oo的字符串的行,注意 o* 表示具有空字符或者一个以上的o,因此两个oo,则要表示为 ooo*,一定要注意


所以, .* 表示0个或者任意多个字符


在 g 和 g 之前的所有字符串所在的行都表示出来

正确理解 [0-9][0-9]* 与 [0-9] 的含义


4、限定连续re字符范围{}

如果想找到2-5的o连续字符串,此时需要用到限定范围的字符{},因为 “{” 和 “}”的符号在shell中石油特殊含义的,因此这里需要转义 \ 使其失去特殊意义,这里找到两个o

[root @localhost tmp]# grep -n 'o\{2\}' re.txt

找到2个到5个的o字符

[root @localhost tmp]# grep -n 'o\{2,5\}' re.txt

如果是找到2个以上的o怎么办呢?

[root @localhost tmp]# grep -n 'o\{2,\}' re.txt


如果要去掉空白行和以#开头的注释行

[root @localhost tmp]#grep -n '^$' re.txt | grep -n '^#'

使用grep进行两次查找,如果使用扩展性表达式,则可以进行一次性操作就可以,大大简化了操作,这里是 egrep

[root @localhost tmp]#egrep -v '^$ | #' re.txt

这里介绍几种常见的扩展性正则表达式的用法

a.   +     重复一个或一个以上的钱一个RE的字符,如果查找god,good,goood,发现o为一个以上,因此可以使用o+

[root @localhost tmp]#egrep -n 'go+d' re.txt

b.  ?      零个或一个的前一个RE字符

[root @localhost tmp]# egrep -n 'go?d' re.txt

上述两种用法,不难发现两者的和为  'go*d' 的形式

c.    |       或的形式,找出数个字符串,查找 god 和 good 两个字符串

[root @localhost tmp]#egrep -n 'gd|good' re.txt

d.   ()       找出组字符串,如果想要找出 god 和 glad ,由于差别在 o 和 la,因此结合 | 的用法

[root @localhost tmp]#egrep -n 'g(o|la)d' re.txt

e.   ()+    多个重复组的判别,查找AxyxyxyxyxyzC,发现xy一直在重复,因此

[root @localhost tmp]#egrep -n 'A(xy)+zC' re.txt






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值