- 首先介绍一些特殊符号,仅列出常用的几个
注意:以中括号的形式,表示一个整体
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