加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ma系列之-7-文本处理工具grep egrep 和正则

发布时间:2020-12-14 00:59:02 所属栏目:百科 来源:网络整理
导读:1 概念: grep概念: 根据模式搜索文本,并将符合模式的文本行显示出来。 global reserch by expression grep的特点:就是在某个行中找只要符合匹配的行就可以,就是做部分匹配的,不是整个单词匹配,显示的是整行数据,重点展示的是匹配到的那个字段。 grep

1 概念:

grep概念: 根据模式搜索文本,并将符合模式的文本行显示出来。 global reserch by expression
grep的特点:就是在某个行中找只要符合匹配的行就可以,就是做部分匹配的,不是整个单词匹配,显示的是整行数据,重点展示的是匹配到的那个字段。

grep使用的模式Pattern组成: 由文本字符和正则表达式的元字符组合而成匹配条件。

2 grep写法:


grep [options] PATTERN [FILE...]
-i: 忽略大小写
--color 匹配到的带颜色展示
-v: 显示没有被模式匹配到的行
-o:只显示被模式匹配到的字符串

eg: # grep --color -o 'a*b' test 如果匹配模式中没有正则表达式的元字符,那么PATTERN的单双引号不加都可以

3 模式Pattern使用到的正则介绍如下:

3.1 正则匹配范围:
*: 匹配其任意前面字符,前面字符出现次数为0到多次
?: 匹配其任意前面字符,前面字符出现0次或者1次 eg: # grep --color -o 'a?b' test 需要使用转义逃逸符(让linux不执行被转义的那部分字符) 否则匹配不出来
[]: 指定范围内
[^]: 指定范围外
.*: 任意长度的任意字符(表示匹配前面.0或者多次 而.在正则中又表示任意单个字符 因此综合结果就是匹配任意长度字符)
?: 匹配其前面的字符1次或0次
{m,n}:匹配其前面的字符至少m次,至多n次
{1,}: 至少一次
{0,3}: 至少0次,最多3次 eg: grep 'a{1,3}b' test.txt 表示去text.txt中找匹配到a至少出现1次最多出现3次后紧跟b的行

3.2 正则匹配特点(贪婪模式):
[root@chinadaas109 zhoumingtest]# cat test
ab
aab
abb
acbacb
[root@chinadaas109 zhoumingtest]# grep 'a*b' test 表示查找b前面出现字符a为0或者多次的单词,并将符合条件的单词打印出来
ab
aab
abb
acbacb 此时从开头到结尾都匹配到了,这就是正则匹配的默认模式,能匹配到多少就匹配到多少(贪婪模式)

3.3 正则元字符:(这些元字符本身没有含义,只是表示一些统配的含义)
.: 匹配任意单个字符
[]: 匹配指定范围内的任意单个字符
[^]:匹配指定范围外的任意单个字符
字符集合:
[:digit:],数字
[:lower:],小写字母
[:upper:],大写字母
[:punct:],标点符号
[:space:],空白字符
[:alpha:],所有字母
[:alnum:],所有数字和字母

3.4 正则位置锚定:

^: 锚定行首,此字符后面的任意内容必须出现在行首
$: 锚定行尾,此字符前面的任意内容必须出现在行尾
^$: 空白行

&;或b: 锚定词首,其后面的任意字符必须作为单词首部出现 <--------> 类比于^ ,这个是表示行首,而 &;表示单词词首
&;或b: 锚定词尾,其前面的任意字符必须作为单词的尾部出现 <--------> 类比于$ ,这个是表示行尾,而 &;表示单词词尾

位置锚定和正则元字符结合案例:

匹配passwd文件中以root开头的行
# grep '^root' /etc/passwd
root:x:0:0:root:/root:/bin/bash

查询inittab文件内的空白行数
# grep '^$' /etc/inittab | wc -l
0

查询inittab文件内末尾为数字的行 
# grep '[[:digit:]]$' /etc/inittab
#   5 - X11

词首/词尾 测试案例:

&;root&; 表示匹配整行中只有root这个单词的行
查询以root为行尾的行
# cat test
ab 
aab
abb
acb
rooter
the user is root
# grep 'root&;' test
the user is root

3.5 正则分组:

写法: () eg: (ab)* ---> *表示匹配的是ab这个整体 0次或者多次
分组的主要目的是--->后向引用(前面出现什么,后面就能引用到什么)
1: 引用第一个左括号以及与之对应的右括号所包括的所有内容
2: 引用第二个左括号以及与之对应的右括号所包括的所有内容
3: 引用第三个左括号以及与之对应的右括号所包括的所有内容

案例:

# cat test
he love his lover
she like her lover
he like his liker
she love her liker

# grep '(l..e).*1' test   ---> 反向引用的案例,匹配 l..e中间是任意字符然后后面也要是前面l..e出现的内容的行 
he love his lover
he like his liker

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读