正则表达式与grep命令

简介:

一、引言

介绍Linux系统中的两个命名:grepegrep。要想使用这2个命令要先学会使用正则表达式,在介绍正则表达式之前,先说明一下,大家都熟知的在word中使用的通配符,即:

*:表示任意长度任意字符。

?:表示任意单个字符。

记住上面这两个字符所表示的意思,后面还会在正则表达式里出现,但意义不同。

 

1.正则表达式:Regular ExpressionREGEXP

由一类特殊字符及文本字符所编写的模式,其有些字符不表示字面意义,而是用于表示控制或通配的功能;

元字符分两类:

基本正则表达式:BRE

扩展的正则表达式:ERE

正则表达式引擎是利用正则表达式模式分析给定的文本的程序,在上亿单位的文本搜索时,有明显优势。

 

2.三类grep命令

1grepGlobal search REgular expression and Print out the line;默认支持使用BRE基本正则表达式;

2egrep:支持使用扩展正则表达式;

3fgrep:不支持使用正则表达式;

 

二、grep命令

作用:文本搜索工具,根据用户指定的pattern(过滤条件)对目标文本逐行进行匹配检查;打印出符合条件的行;

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

1.语法格式

grep [OPTIONS] PATTERN [FILE...]

grep [OPTIONS] [-e PATTERN | -f FILE][FILE...]

 

2.选项

--color=auto:对匹配到的文本着色高亮显示;

-i:忽略字符大小写;

-o:仅显示匹配到的文本自身;(默认显示匹配到的文本整行)

-v--invert-match:反向匹配;

-E--extened-regexp:支持扩展的正则表达式;相当于egrep命令,对grepfgrep有用;

-F--fixed-strings:相当于fgrep命令;

-q--quiet--silent:静默模式,不输出任何信息;取命令执行状态码时常用;

-G--basic-regexp:支持使用基本正则表达式,对egrepfgrep有用;

-P--perl-regexp:支持使用pcre正则表达式(支持元字符很多,非常强大);

 

-e PATTERN--regexp=PATTERN:使用多模式;

-f FILE--file=FILE为每行包含了一个pattern的文本文件,即grepscript;把模式写在一个文件里,通过读取文件(脚本文件),来匹配;

-c:显示统计匹配到的行数;

-r--recursive:对目录下所有文件里的内容根据模式匹配;

 

-A #--after-context=#:表示显示匹配到行的后面#行;

-B #--before-context=#:表示显示匹配到行的前面#行;

-C #-#--context=#:表示显示匹配到行的前后#行;

 

例如:

~]# grep 'root' /etc/passwd:如果模式里有变量要用双引号;

~]# grep -v 'root' /etc/passwd:反向匹配;

~]# grep -i 'root' /etc/passwd:忽略字符大小写;

~]# grep -o 'root' /etc/passwd:仅显示匹配到的文本自身;

~]# grep -q 'root' /etc/passwd:静默模式;

~]# echo $?;取命令执行状态码时常用;

 

例如:

~]# grep -e "r..t" -e"bash" /etc/passwd:使用多模式;

~]# grep -f /root/test/mypat /etc/passwd:使用匹配保存在文件里的模式;

~]# grep -A 1 "^[op]" /etc/passwd:显示匹配到的行后面的一行;

~]# grep -B 2 "^[op]" /etc/passwd:显示匹配到的行前面的两行;

~]# grep -C 1 "^[op]" /etc/passwd:显示匹配到的行前后各一行;

 

模式用引号引起来,有变量时用单引号;

 

三、基本正则表达式元字符

1.字符匹配

.:匹配任意单个字符;

[]:匹配范围内的任意单个字符;(glob机制)

[^]:匹配范围外的单个字符;

[:digit:]:任意单个数字;

[:lower:]:任意单个小写字母:

[:upper:]:任意单个大写字符;

[:alpha:]:任意单个字母;

[:alnum:]:任意单个字母和数字

[:space:]:任意单个空白字符;

[:blank:]:任意单个空格和tab

[:punct:]:任意单个标点符号;

[:cntrl:]:任意单个控制符;

[:graph:]:任意单个能显示的符号;

[:print:]:任意单个可打印符号;

[:xdigit:]:任意单个十六进制字符;

 

man 7 glob查看字符集范围;

 

例如:

~]# ifconfig | grep "r.."r后跟两个字符的行;

~]# ifconfig | grep -i"i[a-z][a-z]":不区分大小写,i后跟两个字母的行;

~]# ifconfig | grep "i[[:alpha:]][[:space:]]"i后跟一个字母再跟一个空格的行;

 

2.次数匹配

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

 

*:匹配前面的字符出现的任意次(0,1或多次);

grep "x*y":只要有y就匹配;

xxxyabc

yab

abcxy

abcy

.*:匹配任意长度的任意字符,相当于glob中的*

grep "x.*y":在xy之间可出现任意长度任意字符即匹配;

xxxyabc

abcxy

\+:匹配前面的字符至少1次(1次或多次);\为转义符;

grep "x\+y"y之前必须出现一个x

xxxyabc

abcxy

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

grep "x\?y":只要有y就匹配;

xxxyabc

yab

abcxy

abcy

\{m\}:匹配其前面的字符出现m次,m为非负整数;

grep "x\{2\}y"y前出现2x就匹配;

xxxyabc

\{m,n\}:匹配其前面的字符出现m次,m为非负整数;闭区间[m,n]

\{0,n\}:至多n次;

\{m,\}:至少m次;

例如:

~]# ifconfig | grep"i[[:alpha:]]\{3\}":匹配i后跟3个字母的行;

~]# ifconfig | grep"i[[:alpha:]]\{3,\}":匹配i后跟至少3个字母的行;

 

3.位置锚定

限制使用模式搜索文本,限制模式所匹配到的文本只能出现于目标文本的哪个位置;

 

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

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

^PATTERN$:要让PATTERN完全匹配一整行;

^$:匹配空行;

^[[:space:]].*$:匹配空白行;

 

例如:

~]# grep "^r..t" /etc/passwd:匹配r开头后跟两个字符再跟t的行;

~]# grep "l.\{3\}n" /etc/passwd:匹配l后跟3个字符再跟n的行;

~]# grep "l.\{3\}n$" /etc/passwd:匹配l后跟3个字符再跟n结尾的行;

~]# grep "^l.\{3\}n$" /etc/passwd:匹配只能是l开头后跟3个字符再跟n结尾的行;

~]# grep "[[:space:]]\+" /etc/passwd:匹配至少连续出现一个空格的行;

 

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

 

\<\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,/bPATTERN

\>\b:词尾锚定,用于的承诺模式的右侧,格式为PATTERN\>,PATTERN\b

 

例如:

~]# grep "\<r..t" /etc/passwd:匹配单词词首:r后跟两个字符再跟t的的行;

~]# grep "\<r..t\>"/etc/passwd:匹配单词:r后跟两个字符再跟t的行;

~]# ifconfig | grep"\<[0-9]\{3\}\>":匹配单词:三个数字;

 

4.分组与引用

\(PATTERN\):将此PATTERN匹配到的字符当作一个不可分割的整体进行处理;

 

注意:分组括号中的模式匹配到的字符会被正则表达式引擎自动记录于内部变量中,这些变量是\1,\2,\3,...

 

例如:pat1\(pat2\)pat3\(pat4\(pat5)pat6\)

 

\n:模式中的第n个左括号以及与之匹配的右括号之间的模式所匹配到的字符串;(不是模式,而是模式匹配的结果)

 

\1:表示第一组括号总的PATTERN匹配到的的字符串;上例:pat2

\2:表示第二组括号总的PATTERN匹配到的的字符串;上例:pat4\(pat5)pat6

\3:表示第三组括号总的PATTERN匹配到的的字符串;上例:pat5

...

示例:

he love his lover

he like his lover

he love his liker

he like his liker

 

.*l..e.*l..er

\(l..e\).*\1r

 

~]# grep -o 'l..e.*l..er' fenzu_pattern.txt:不能完成精确匹配;

~]# grep -o '\(l..e\).*\1r'fenzu_pattern.txt:分组可完成精确匹配;

 

后向引用:引用前面的括号中的模式所匹配到的字符串;

 

四、egrep命令

支持使用扩展的正则表达式的grep命令,相当于grep -E

1.语法格式

egrep [OPTIONS] PATTERN [FILE...]

2.选项

选项同grep

 

五、扩展正则表达式的元字符:无需转义符

1.字符匹配

.:匹配任意单个字符;

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

[^]:匹配范围外的单个字符;

[:digit:]:任意单个数字;

[:lower:]:任意单个小写字母:

[:upper:]:任意单个大写字符;

[:alpha:]:任意单个字母;

[:alnum:]:任意单个字母和数字

[:space:]:任意单个空格;

[:blank:]:任意单个空格和tab

[:punct:]:任意单个标点符号;

 

2.次数匹配

*:匹配前面的字符(可有可无)出现的任意次(0,1或多次);

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

+:匹配前面的字符至少1次(1次或多次);

{m}:匹配其前面的字符出现m次,m为非负整数;

{m,n}:匹配其前面的字符出现m次,m为非负整数;[m,n]

{0,n}:至多n次;

{m,}:至少m次;

 

3.位置锚定

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

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

^PATTERN$:要让PATTERN完全匹配一整行;

^$:匹配空行

\<,\b:词首锚定,用于单词模式的左侧,格式为\<PATTERN,/bPATTERN

\>,\b:词尾锚定,用于的承诺模式的右侧,格式为PATTERN\>,PATTERN\b

 

4.分组及引用

(pattern):分组,括号中的模式匹配到的字符会被存储于正则表达式引擎内部的变量中;

后向引用:\1,\2,\3,...

 

5.

a|ba或者b

C|cat:表示Ccat

(C|c)at:表示Catcat










本文转自 crystaleone 51CTO博客,原文链接:http://blog.51cto.com/linsj/1750394,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
存储 算法 Shell
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
【Shell 命令集合 文档编辑】Linux 正则表达式匹配 egrep命令使用教程
12 0
|
2月前
|
运维 Unix Linux
grep正则表达式搜索
grep正则表达式搜索
18 3
|
7月前
|
Linux Perl
[笔记]linux grep之正则表达式
[笔记]linux grep之正则表达式
|
8月前
|
Unix Linux
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
如何在 Linux 中使用 Grep 和正则表达式进行文本搜索?
199 5
|
11月前
|
机器学习/深度学习 NoSQL Linux
Linux行处理工具: grep 正则表达式
Linux行处理工具: grep 正则表达式
83 0
|
11月前
|
JavaScript Java Linux
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(三)
本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux,很多操作可以通过鼠标完成,或许更加直观。 推荐使用neovim(结合鼠标操作更加丝滑)。
|
11月前
|
JavaScript 搜索推荐 Linux
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(二)
本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux,很多操作可以通过鼠标完成,或许更加直观。 推荐使用neovim(结合鼠标操作更加丝滑)。
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(二)
|
11月前
|
数据可视化 搜索推荐 Unix
【vim && neovim】从入门到放弃(“四种”模式、常用命令、正则表达式、文件属性、插件安装--代码补全、一键格式化、显示目录)(一)
本文所有操作均通过ssh连接腾讯云服务器完成。如果你正在使用安装GNOME桌面的Linux,很多操作可以通过鼠标完成,或许更加直观。 推荐使用neovim(结合鼠标操作更加丝滑)。
|
11月前
|
机器学习/深度学习 C语言 数据安全/隐私保护
『正则表达式』概念 及在grep、awk、sed、C语言、Python中的简单应用
正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex、regexp或RE),是一种文本模式。它可以用来检查一个字符串是否符合某个规则,或者从一个字符串中提取出符合某个规则的子串。正则表达式通常被用来检索、替换那些符合某个模式(规则)的文本。 正则表达式是由普通字符(例如字符 a 到 z)以及特殊字符(称为"元字符")组成的文字模式。模式描述在搜索文本时要匹配的一个或多个字符串。
|
12月前
|
Linux Windows
【Linux命令篇】正则表达式浅析
转义字符是将普通字符转化为特殊字符的一种方式。 在正则表达式中,一些字符被定义为特殊字符(也称为元字符),它们具有特殊的含义。这些特殊字符包括:
130 0