Linux-----浅析grep工具及正则表达式

grep工具是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。

grep的语法:
这里写图片描述

在使用grep的时候需要注意以下几点:

  • grep不加引号直接过滤字符串
  • grep在进行模式匹配的时候必须加引号,单引和双引号都可以
  • grep在引用变量的时候必须加双引号

来看看grep的选项:

  • -a:不要忽略二进制数据
  • -A #:除了显示符合条件的那一行之外,还显示该行之后#行的内容
  • -B #:除了显示符合条件的那一行之外,还显示该行之前#行的内容
  • -c:计算符合条件的列数
  • -C #:除了显示符合条件的那一行之外,还显示该行前#行和该行后#行的内容
  • -d:要指定查找的是目录而非文件,必须使用这项参数
  • -e:指定字符串为查找文件内容的条件
  • -E:使用扩展的正则表达式
  • -f 文件:要匹配的模式来源于文件,类似于在别的文件中搜索该文件中的内容
  • -F:将条件视为固定字符串的列表
  • -G:使用基准模式来匹配
  • -h:在显示符合条件的那一列之前不标示该列所属的文件名称
  • -H:在显示符合条件的那一列之前标示该列所属的文件名称
  • -i:忽略大小写
  • -l:列出文件内容符合指定条件的文件名称
  • -L:列出文件内容不符合指定条件的文件名称
  • -n:在显示符合条件的那一列之前标示出该列的编号
  • -q:安静模式匹配,不显示任何信息
  • -R/-r:递归模式进行匹配
  • -s:不显示错误信息
  • -v:选择不匹配的行
  • -w:只显示全字符合的列
  • -x:只显示全列符合的列
  • -y:和选项 -i 类似
  • -o:只输出文件中匹配到的部分

接下来给其中比较常用的选项举几个例子:
在举例子之前再说一个选项 - -color 是为了将匹配到的结果高亮显示
1. 先来看看最常见的匹配:
这里写图片描述
2. grep -o --color "bbbb" file 只显示匹配到的部分
这里写图片描述
3. grep -i --color "bbbb" file 忽略大小写
这里写图片描述
4. grep -v --color "bbbb" file 输出不匹配的行
这里写图片描述
5. grep -A 2 --color "bbbb" file 输出匹配的行及该行的后两行
grep -B 2 --color "bbbb" file 输出匹配的行及该行的前两行
grep -C 2 --color "bbbb" file 输出匹配的行及该行的前后两行

这里写图片描述
6. grep -E --color [2-4]+ file 使用正则表达式匹配
这里写图片描述
这个例子中的模式是一个正则表达式,接下来谈谈什么是正则表达式

正则表达式

1. 概念

正则表达式是对字符串(包括普通字符)和特殊字符操作的一种逻辑公式,就是用事先定义好的一些特殊字符及这些特殊字符的组合,组成一个“规则字符串”,这个规则字符串用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串

2. 正则表达式的基本要素
  • 字符类
  • 数量限定符
  • 位置限定符
    -特殊符号
3. 字符类
字符 含义
. 点 匹配任意一个字符,除过”\n” “\r”
[ ] 匹配中括号中的任意一个字符
- 可以在[ ]中表示字符范围
^ 位于[ ]的开头,匹配除了括号中字符之外的任意一个字符
[[:xxx:]] xxx表示grep工具预定义的一些命名字符

(1) echo "this is string" | grep -E --color 'is.' 匹配is后面跟了任意一个字符的字符串
这里写图片描述
可以看到好像是匹配了 is空格is空格,这是因为grep匹配是贪心匹配,它会将后面符合条件的都匹配,利用-o选项就可以看出来
这里写图片描述

(2)echo "1234abcd" | grep -E --color '[ac]' 匹配括号中的任意一个字符
这里写图片描述

(3)echo "1234abcd" | grep -E --color '[a-c]' 匹配 a-c中的任意一个字符
这里写图片描述

(4)echo "1234abcd" | grep -E --color '[^a-d]' 匹配除了括号中字符的任意一个字符
这里写图片描述

(5)echo "1234abcd" | grep -E --color '[[:digit:]]' 匹配任意一个数字字符
echo "1234abcd" | grep -E --color '[[:alpha:]]' 匹配任意一个字母字符
这里写图片描述

4. 数量限定符
字符 含义
? 紧跟在前面的子表达式匹配零次或一次
+ 紧跟在前面的子表达式匹配一次或多次
* 紧跟在前面的子表达式匹配零次或一次
{N} N是一个非负整数,紧跟在它前面的子表达式匹配确定的N次
{N,} 紧跟在它前面的子表达式匹配至少N次
{,M} 紧跟在它前面的子表达式匹配最多N次
{N,M} 紧跟在它前面的子表达式匹配最少N次,最多M次

(1)echo "bcd" | grep -E --color 'a?'
echo "aabacada" | grep -E --color 'a?' 匹配a一次或零次
这里写图片描述

(2) echo "ab12cdef" | grep -E --color '[0-9][a-z]+' 匹配第一个字符为0-9的数字,后面是a-z的字母出现一次或多次
echo "ab12abcdef" | grep -E --color 'a+' 匹配a出现一次或多次
echo "b12bcdef" | grep -E --color 'a+' 匹配a出现一次或多次
这里写图片描述

(3)echo "b12bcdef" | grep -E --color 'a*' 匹配a出现零次或多次
echo "b12abacadef" | grep -E --color 'a*' 匹配a出现零次或多次

这里写图片描述

(4)echo "b12abcdef" | grep -E --color 'a{3}'
echo "b12abacadef" | grep -E --color 'a{3}'
echo "b12aaaabcdef" | grep -E --color 'a{3}'
匹配a精确出现3次,注意这个3次必须是连续出现
这里写图片描述

(5)echo "b12aaabcdef" | grep -E --color 'a{3,}'
echo "b12aaaabcdef" | grep -E --color 'a{3,}'
echo "b12aabcdef" | grep -E --color 'a{3,}' 匹配a出现至少三次
这里写图片描述

(6)测试环境不支持 {,N} 这种方式,在此不做演示

(7)echo "b12aaaabcdef" | grep -E --color "a{1,3}" 匹配a出现至少一次至多三次
这里写图片描述

5. 位置限定符
字符 含义
^ 匹配行首的位置
$ 匹配行末的位置
\< 匹配单词开头的位置
\> 匹配单词结尾的位置
\b 匹配单词开头或结尾的位置
\B 匹配非单词开头或结尾的位置

(1)grep -E --color '^a' file 匹配行首是a的
这里写图片描述

(2)grep -E --color 'a$' file 匹配行尾是a的
这里写图片描述

(3)grep -E --color '^a$' file 匹配行首行尾都是a,意思就是精确匹配a这个单词
这里写图片描述

(4)echo "this is isspace" | grep -E --color '\<is' 匹配以is开头的
echo "this is isspace" | grep -E --color 'is\>' 匹配以is结尾的
echo "this is isspace" | grep -E --color '\<is\>'匹配以is开头以is结尾的
这里写图片描述

(5)echo "this isis isspace" | grep -E --color '\bis' 匹配is在开头的
echo "this isis isspace" | grep -E --color 'is\b' 匹配is在结尾的
echo "this isis isspace" | grep -E --color '\bis\b'匹配is即在开头也在结尾的,即匹配is
这里写图片描述

(6) echo "ttishh is isspace" | grep -E --color '\Bis' 匹配is不在开头的,即is在中间或结尾
echo "ttishh is isspace" | grep -E --color 'is\B' 匹配is不在结尾的,即is在开头或中间
echo "ttishh is isspace" | grep -E --color '\Bis\B'匹配is不在开头也不在结尾的,及is在中间
这里写图片描述

6. 特殊字符
字符 含义
\ 转义字符,将普通字符转为特殊字符,特殊字符转为普通字符
( ) 将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
| 连接两个子表达式,表示或的关系
7. 正则表达式的分类
  • 基本的正则表达式 BREs
  • 扩展的正则表达式 EREs
  • Perl的正则表达式 PREs

grep 指令后不跟任何参数,则表示要使用 ”BREs“
grep 指令后跟 ”-E” 参数,则表示要使用 “EREs“
grep 指令后跟 “-P” 参数,则表示要使用 “PREs”

猜你喜欢

转载自blog.csdn.net/qq_34021920/article/details/80963162