一、正则表达式

       在计算机科学中,正则表达式是用来描述或匹配一系列符合某个句法规则的字符串;在文本编辑器或某些工具(例如bash环境)中,正则表达式通常被用检索那些符合某个模式的文本内容。在linux中,正则表达式是由一类字符所书写的模式。通过实现定义好的模式来实现对bash环境中所需要字符串的过滤。

       正则表达式是由一系列的普通字符和一些元字符组成。普通字符主要包括了大小写字母和数字。元字符则具有特殊的含义。它不表示字符本身的意义而用于额外的一些功能性的描述。正则表达式有基本正则表达式和扩展正则表达式之分,下面我将列出在linux中常用的一些常用的元字符,并用相关的实例来进行讲解:

1.基本正则表达式

LINUX系统学习之正则表达式_第1张图片

2.扩展正则表达式

以下主要列出不同于基本正则表达式的部分元字符

LINUX系统学习之正则表达式_第2张图片

3.在linux中还有其它的一些转义字符,但这里仅对常用的进行了一些列举和解释。有兴趣的朋友可以通过“man 7 regex”查看man文档中提供的帮助系统。


二、grep命令的使用

       下面我来向大家介绍如何通过grep命令来使用正则表达式进行相应的模式匹配。首先我来介绍一下grep命令的基本使用。

       grep (Global Search Regular Expression and Printing),表示全面搜索正则表达式并进行打印,是一种强大的文本搜索工具,它能够使用正则表达式搜索文本,并把匹配的行打印出来。grep有三种,包括grep、egrep和fgrep。

分别表示如下:

LINUX系统学习之正则表达式_第3张图片


三、以下我将在rhel6.4上使用具体的实例来显示grep命令如何使用正则表达式来进行模式匹配。

使用前在当前bash中对grep设置一个别名,命令如下:

alias grep='grep --color=auto'

1.显示/etc/passwd文件中以不区分大小写的s开头的行。

grep "^[sS]" /etc/passwd
egrep "^(s|S)" /etc/passwd

2.显示默认shell为bash,且其用户ID号最小的用户的用户名。

grep "/bin/bash$" /etc/passwd | sort -n -t: -k3 | cut -d: -f1

3.显示/etc/rc.d/rc.sysinit中以#开头,且后面跟一个或多个空白字符,而后又跟了任意非空白字符的行。

grep "^#[[:space:]]\{1,\}[^[:space:]]" /etc/rc.d/rc.sysinit
egrep "^#[[:space:]]+[^[:space:]]" /etc/rc.d/rc.sysinit

4.显示/etc/rc.d/rc.sysinit中符合任意单个字符后面跟了个n,n后面有任意长度的任意字符,而后是任意单个字符后面跟了个n,但后面的n之前的字符要与前面的n之前的字符相同。

grep "\(.n\)".*\1" /etc/rc.d/rc.sysinit

5.显示test.txt文件中的,1位数,或2位数。

grep -w "[0-9]\{1,2\}" test.txt
grep "\<[0-9]\{1,2\}\>" test.txt

6.显示ifconfig命令结果中的1-255之间的整数。

ifconfig | egrep "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\>"

7.匹配ifconfig命令中的IP地址,要求匹配范围为1.0.0.1~~223.255.255.254

ifconfig | egrep -o --color "\<([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-1][0-9]|22[0-3])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])\.([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-4])\>"