Linux正则表达式及文本处理grep

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/rdgfdd/article/details/82670922

今天,我们来学习一下正则表达式。


正则表达式


1,什么是正则表达式

正则表达式,即 Regual Expression 简写为 REGEXP;是由一类特殊字符及文本字符所编写的模式。其中有些字符并不表示其字面意义,而是用于表示控制或通配的功能,这些字符称为元字符。

2,正则表达式的类型

正则表达式分为:

  • 基本正则表达式
  • 扩展正则表达式

3,元字符

(1)字符匹配

. : 匹配任意单个字符

[ ] : 匹配指定范围内的任意单个字符

[^] : 匹配指定范围外的任意单个字符

各种范围表示如下:
[:digit:] : 任意一个数字
[:lower:] : 任意一个小写字母
[:upper:] : 任意一个大写字母
[:alpha:] : 任意一个字母
[:alnum:] : 任意一个数字或字母
[:punct:] : 任意一个标点符号
[:space:] : 一个空白字符

(2) 匹配次数

用在要指定其出现的次数的字符后面;用于限制其前面字符的出现的次数,默认为贪婪模式;

* : 匹配其前面的字符任意次;0次,1次或多次;

. * : 匹配任意长度的任意字符;

? : 匹配其前面的字符0次或1次,即前面的字符是可有可无的;

+ : 匹配其前面的字符1次或多次,即前面的字符至少出现1次;

{m} : 匹配其前面的字符m次;

{m,n} : 匹配其前面的字符至少m次,至多n次;

{0,n} : 匹配其前面的字符至多n次;

{m,} : 匹配其前面的字符至少m次;

(3) 位置锚定

^ : 行首锚定,用于模式的最左侧;

$ : 行尾锚定,用于模式的最右侧;

^PATTERN$ : 用PATTERN匹配整行

^$ : 匹配空白行;

1$ : 显示空白行或者只含有空白字符的行;

(4)单词锚定

非特殊字符组成的连续字符(字符串)都成为单词;

< 或 \b : 词首锚定,用于单词模式的左侧;

> 或 \b : 词尾锚定,用于单词模式的右侧;

< PATTERN > : 匹配完整单词;

(5)分组及引用

\( \) : 将一个或多个字符捆绑在一起,当做一个整体进行处理;

后向引用:引用前面的分组括号中的模式所匹配到的字符。

此用法将“分组括号内的模式匹配到的内容”被正则表达式引擎自动记录于内部的变量中,这些变量分别为:

\1 : 从左侧起,第一对括号之间的模式匹配到的字符(串);

\2 : 从左侧起,第二对括号之间的模式匹配到的字符(串);

并以此类推…

示例:首先我们创建文本文件lovers.txt,其内容为:
He loves his lover
He likes his lover
He likes her liker
He loves her liker

我们要匹配到一个字符串以l开头以e结尾,并且在之后匹配一个与前面匹配完全相同的字符串。

[root@localhost jeffrey]# grep "\(l..e\).*\1" lovers.txt
He loves his lover
She likes her liker

#####现在,我们来见识一下linux文本处理三剑客之一:grep


grep : Glob search REgular expression and Print out the line


**功能:**文本搜索工具,根据用户指定的模式(过滤条件),对目标文本逐行进行匹配检查,并打印出匹配到的行;

**模式:**由正则表达式的元字符及文本字符所编写的过滤条件;

**原理:**正则表达式引擎;

用法:
# grep [options] PATTERN [FILE…]
# grep [options] [-e PATTERN | -f FILE] [FILE…]

选项:

–color=auto 对匹配到的文本着色后高亮处理
-i 忽略字符大小写(ignonrecase)
-o 仅显示匹配到的字符串本身;
-v, - - invert-match 反向显示,即显示没有被匹配到的行;
-E 支持使用扩展的正则表达式元字符;
-q, - - quiet, - - silent 静默模式,即不输出任何信息;
-A # (after)显示匹配行及其之后的#行;
-B # (before)显示匹配行及其之前的#行;
-C # (context)显示匹配行及其前后各#行;

实践是检验真理的唯一标准,我们动手练习一下吧!

1,显示/etc/passwd文件中不易/bin/bash结尾的行。

[root@localhost /]# grep -v "/bin/bash$" /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
......

2,找出/etc/passwd文件中的两位数或三位数。

[root@localhost /]# grep "\<[0-9][1-9][1-9]\>" /etc/passwd
.....
pulse:x:171:171:PulseAudio System Daemon:/var/run/pulse:/sbin/nologin
gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin
jeffrey:x:1000:1000:jeffrey,Security,911,9111:/home/jeffrey:/bin/bash

3,找出/etc/rc.d/rc.sysinit或/etc/grub2.cfg文件中,以至少一个空白字符开头,且后面非空白字符的行。

[root@localhost /]# grep "^[[:space:]]\+[^[:space:]]" /etc/grub2.cfg
  load_env
   set default="${next_entry}"
   set next_entry=
   save_env next_entry
   set boot_once=true
   set default="${saved_entry}"
   .....

4,找出“netstat -tan”命令的结果中以“LISTEN”后跟0,1或多个空白行字符结尾的行。

[jeffrey@localhost ~]$ netstat -tan | grep "LISTEN[[:space:]]*$"
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN     
tcp        0      0 192.168.122.1:53        0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:631           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN     
tcp6       0      0 :::111                  :::*                    LISTEN     
tcp6       0      0 :::22                   :::*                    LISTEN     
tcp6       0      0 ::1:631                 :::*                    LISTEN     
tcp6       0      0 ::1:25                  :::*                    LISTEN     


  1. [:space:] ↩︎

猜你喜欢

转载自blog.csdn.net/rdgfdd/article/details/82670922