文档章节

Linux 下 grep 命令的正则表达式规范

Konghy
 Konghy
发布于 2015/10/27 10:05
字数 1221
阅读 1106
收藏 4
使用单个字符串来描述、匹配一系列符合某个句法规则的字符串,这就是正则表达式。Linux 的 grep 命令是一种查找过滤工具,用于在文件中查找指定模式的字符串,其支持正则表达式。

通配符和正则表达式的区别

在谈正则表达式之前,首先说一下通配符和正则表达式的区别,二者容易混淆。曾经我把通配符认为就是正则表达式,在本该使用统配符的地方意图使用正则表达式,由于没能达到想要的结果,这才意识到不对劲。通配符一般用于linux的shell命令中,例如:

grep hello *

这表示在当前目录下的所有文件中查找含“hello”字符串的文件的行。下面列出一些通配符的含义:

  •     [a-z]或[12]:匹配方括号中指定范围内的单个字符或方括号列出的其中一个字符。
  •     [!9]:不匹配方括号中所列字符或指定范围内的单个字符。
  •     *:匹配0个字符或多个字符。
  •     ?:匹配任何单个字符,且不能为空字符。

正则表达式分类

1、基本的正则表达式(Basic Regular Expression 又叫 Basic RegEx 简称 BREs)

2、扩展的正则表达式(Extended Regular Expression 又叫 Extended RegEx 简称 EREs)

3、Perl 的正则表达式(Perl Regular Expression 又叫 Perl RegEx 简称 PREs)

其实我们在大多数高级编程语言中所使用的正则表达式都源自Perl。实际上,正则表达式从Perl衍生出一个显赫的流派,叫做PCRE(Perl Compatible Regular Expression)。其他高级语言大多基于此修改或者扩展。而 Unix/Linux 下的工具大多采用POSIX规范,同时,POSIX规范又可分为两种流派,即 BREs 和 EREs。


正则表达式 Extended 规范

1、字符类

.   匹配任意一个字符
[]  匹配括号中的任意一个字符
\-  用在[]中,表示字符范围
^   如果位于[]的开头,则匹配除去括号中字符之外的一切字符
[[:xxx:]]   grep 工具预定义的一些命名字符类,例如 [[:alpha:]] 匹配一个字母,[[:digit:]] 匹配一个数字

2、数量限定符

?   紧跟在它前面的单元匹配零次或一次
\+  紧跟在它前面的单元匹配一次或多次
\*  紧跟在它前面的单元匹配零次或多次
{N}     紧跟在它前面的单元应精确匹配N次  [1-9][0-9]{2} 匹配从100 到999 的整数
{N,}    紧跟在它前面的单元至少要匹配n次
{,M}    紧跟在它前面的单元至多匹配m次
{N,M}   紧跟在它前面的单元至少匹配n次,至多匹配m次

3、位置限定符

^   匹配行首的位置
$   匹配行末的位置
\<   匹配单词开头的位置
\>   匹配单词结尾的位置
\b  匹配单词开头或结尾的位置
\B  匹配非单词开头和结尾的位置

4、其他特殊字符

\   转义字符,普通字符转义为特殊字符,特殊字符转义为普通字符
()  将正则表达式的一部分括起来组成一个单元,可以对整个单元使用数量限定符
|   连接两个表达式,表示或的关系

以上介绍的是grep正则表达式的 Extended 规范,Basic 规范也有这些语法,只是字符 ?+{}|() 应解释为普通字符,要表示上述特殊含义则需要加 \ 转义。如果用 grep 而不是 egrep,并且不加 -E 参数,则应该遵照Basic 规范来写正则表达式。当然,如果是 grep -F,则只搜索固定字符串而不搜索正则表达式模式,不会按正则表达式语法解析后边的参数,grep -F 等价于 fgrep。

最后需要强调的一点是,grep 找的是包含某一模式的行,而不是完全匹配某一模式的行。也就是说,grep 的正则表达式匹配是以行为单位的。


一些示例

搜索以小写字母开头的行

grep -n '^[a-z]' temp.txt

-n 参数表示输出时显示匹配的行号

搜索开头不是英文字母的行

grep -n '^[^a-zA-Z]' temp.txt

搜索空行

grep -n '^$' temp.txt

搜索以 g 开头和结尾的字符串在的行

grep -n 'g.*g' temp.txt

搜索g开头和结尾,中间是至少一个o的字符串

grep -n 'goo*g' temp.txt

© 著作权归作者所有

共有 人打赏支持
Konghy
粉丝 8
博文 22
码字总数 31889
作品 0
朝阳
程序员
私信 提问
linux下grep、awk和sed工具用法概览

linux下grep、awk和sed工具用法概览 在linux下,grep、awk和sed是非常强大的文本处理工具,其中grep命令主要用作文本搜索,而awk和sed命令侧重于文本的编辑等操作,另外awk本身还可以是编程语...

小陶小陶
2018/09/11
0
0
linux grep正则学习(转载)

虽然正则表达式经常都在用,但是很少能够静下心来仔细的总结一下。最近看了一个台湾人的网站叫做鸟哥Linux私房菜,关于正则表达式的描述挺详细的。在此,我进行一下总结,如果想仔细的学习正...

开卷书生
2014/08/01
0
0
linux grep命令,强大的文本搜索

1.作用 linux系统中grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用...

吴汉阳
2010/03/19
191
0
Linux/Unix工具与正则表达式的POSIX规范--awk使用中遇到的坑

对正则表达式有基本了解的读者,一定不会陌生『d』、『[a-z]+』之类的表达式,前者匹配一个数字字符,后者匹配一个以上的小写英文字母。但是如果你用过vi、grep、awk、sed之类Linux/Unix下的...

流浪的洋葱
2014/11/20
0
0
17个案例带你3分钟搞定Linux正则表达式

正则表达式是一种字符模式,用于在查找过程中匹配制定的字符。 元字符通常在Linux中分为两类: Shell元字符,由Linux Shell进行解析; 正则表达式元字符,由vi/grep/sed/awk等文本处理工具进...

Mr_zebra
2018/09/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Linux iptables之mangle表使用案例

mangle表的用途 mangle表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。 mangel表使用示例 示例1-策略路由1 内网的客户机通...

月下狼
35分钟前
2
0
OSChina 周日乱弹 —— 兼职我想去学学布偶戏

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @clouddyy : 《火炎 - 女王蜂》 《火炎 - 女王蜂》 手机党少年们想听歌,请使劲儿戳(这里) @小鱼丁 :还在睡觉突然接到一个小哥哥电话“x...

小小编辑
47分钟前
42
3
租房软件隐私保护如同虚设

近日,苏州市民赵先生向江苏新闻广播新闻热线025-84658888反映,他在“安居客”手机应用软件上浏览二手房信息,并且使用该软件自动生成的虚拟号码向当地一家中介公司进行咨询。可电话刚挂不久...

linux-tao
今天
3
0
分布式项目(五)iot-pgsql

书接上回,在Mapping server中,我们已经把数据都整理好了,现在利用postgresql存储历史数据。 iot-pgsql 构建iot-pgsql模块,这里我们写数据库为了性能考虑不在使用mybatis,换成spring jd...

lelinked
今天
6
0
一文分析java基础面试题中易出错考点

前言 这篇文章主要针对的是笔试题中出现的通过查看代码执行结果选择正确答案题材。 正式进入题目内容: 1、(单选题)下面代码的输出结果是什么? public class Base { private Strin...

一看就喷亏的小猿
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部