正则表达式是一种符号表示法,用于识别文本模式。Linux处理正则表达式的主要程序是grep。grep搜索与正则表达式匹配的行,并将结果输送至标准输出。
1. grep匹配模式
grep按下述方式接受选项和参数(其中,regex表示正则表达式)
grep [options] regex [files]
其中options主要为下表:
选项 | 含义 | 功能描述 |
-i | ignore case | 忽略大小写 |
-v | invert match | 不匹配匹配的 |
-l | file-with-match | 输出匹配的文件名 |
-L | file-without-match | 输出不匹配的文件名 |
-c | count | 输出匹配的数目(行数) |
-n | number | 输出匹配行的同时在前面加上文件名及在文件名中的行数 |
-h | no-filename | 抑制文件名的输出 |
作为一个Linux管理员,您需要对文本文件进行处理。您可以使用不同的工具如grep、awk以及sed去查找包含特定文本串的文件。这里,我将介绍一种使用正则表达式,以灵活的方式,去搜索文件中的文本的方法。
让我们考虑一个正则表达式发挥作用的例子。比如,当你尝试使用命令grep –r host /时,其返回的结果会很庞大。因为每一个包含host这个文本串的字(像ghostscript这样的字)都会匹配。采用正则表达式,你可以更好地定制你要查找什么。例如,你可以使用正则表达式'^host',告诉grep仅仅查找以host开始的行。
正则表达式并不是在所有命令中都可用,您使用的命令必须已经事先编好程序,以便能够使用正则表达式。这些命令中最普遍使用的命令是grep、tr以及vi。其它的工具,像sed和awk,也可以使用正则表达式。
使用正则表达式的一个例子为:
grep 'lin.x' *
正则表达式'lin.x'中的点有特殊的含义。它会匹配处于该位置的任意字符。为了防止解释性的问题,我建议您总是将正则表达式置于单引号间,这样就可以防止shell对正则表达式进行解释。
使用正则表达式
您可以使用正则表达式做很多事情。在以下的列表中,您可以找到一些最普通、最常用的正则表达式的例子。
* ^:表示文本串必须在一行的开头。所以,当查找行的开头只为“hosts”的行,可以使用命令:grep -ls '^hosts'
* $:代表了一行的结尾。所以,当查找行的结尾只为“hosts”的行,可以使用命令:grep -ls 'hosts$'
* 你可以在一个正则表达式中结合^和$,去查找仅仅包含"yes"的行,使用的命令为grep -ls '^yes$'
* .: 一个可以指代除了换行符以外任意字符的通配符。为了查找包含tex、tux、tox或者tix的行,可以使用:grep -ls 't.x'
* [ ]:表示在一个正则表达式中,方括号之间的字符是可选的。为了查找名字为pinda或者linda的用户,可以使用命令:grep -ls '[pl]inda'
* [^ ]:忽略掉方括号中^之后的所有字符。为了查找包含文本linda的行,并忽略掉其中仅包含linda或者pinda的行,命令为:grep -ls '[^pl]inda'
* -:代表一类或者一个范围内的字符。在像tr这样的命令中,这是非常有用的。以下的命令可以将所有的小写字母转为大写字母:tr a-z A-Z < mytext。同样地,你可以使用正则表达式grep -ls '^0-9'去查找其中有一些行是以数字开头的文件。
* \< 和 \>:查找一个字的开头或者结尾的模式。查找行的开头的字以"san"为起始的命令为: grep \<SAN< code>。这些正则表达式有两个缺点—他们并不查找以指定的正则表达式开头的行,并且他们并不被所有的工具所支持。但是,vi和grep是支持这种用法的。
* \:确保在正则表达式中有特殊含义的字符不被解释。查找以任何字符开始,后面跟着文本"host"的文本串的命令为grep -ls '.host'。而如果你需要查找以点为第一个字符,紧接着为"host"的文本串,可以用命令:grep -ls '\.host'
这些正则表达式可以帮助您找到包含特定文本串的字。您也可以使用正则表达式去指定,在一个字中,该字符串出现的频率。比如,您可以使用正则表达式去搜索刚好包含用户名"linda"三次的文件。为了达到这一目的,您需要使用正则表达式的重复算子,并保证整个正则表达式位于引号中。没有引号的话,您可能会导致shell去解释您的重复算子。
最重要的重复算子的列表如下:
* *:表示前述的正则表达式可能出现一次、多次或者根本不出现。注意:不要和shell中的*混淆—在shell中,*表示任意字符,而在正则表达式中,*表示之前的正则表达式可能存在。
* ?:表示在该位置可能是一个字符(但并不是必须是)。例如,同时查找color和colour的命令为:grep -ls 'colo.r'
* +:表示之前的字符或者正则表达式至少要出现一次
* \{n\}:表示之前的字符或者正则表达式至少要出现n次。当你查找一个介于100到999之间的数字时,这是很有用的:grep -ls '0-9\{3\}'
我们已经向您概述了正则表达式的使用方法。这可以让您在做一个管理员时,更加地有效率。正则表达式可以提供更多的功能,包括一些相当复杂的操作。但在之前,请首先掌握我们已经介绍的这些技能。正则表达式可以非常复杂,以至于你会很容易迷失其中。
问题内容: 我想在包含单行的超大文件(fe大于1 GB)中搜索模式。无法将其加载到内存中。目前,我使用读入缓冲区(1024个字符)。主要步骤: 将数据读入两个缓冲区 该缓冲区中的搜索模式 如果找到模式,则增加变量 将第二个缓冲区复制到第一个 将数据加载到第二个缓冲区 在两个缓冲区中搜索模式。 如果找到模式,则增加变量 重复上述步骤(从4开始),直到EOF 该算法(两个缓冲区)让我避免了将搜索到的文
问题内容: 我需要找到与特定正则表达式匹配的所有软件包: 基本上,包的名字应该与启动,并有后话。例如,以下软件包应匹配: 我可以做,但是有很多我不感兴趣的软件包。 是否提供通过正则表达式查找软件包的方法?或者,我应该只是通过管道传递结果来过滤掉无关的包? 此外,可能是一个的“交集” ,并有助于太。 问题答案: alecxe,我相信这是您要寻找的一线客。 如下面评论中铬酸盐所建议的那样,您可以根据需
本文向大家介绍go语言文件正则表达式搜索功能示例,包括了go语言文件正则表达式搜索功能示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了go语言文件正则表达式搜索功能。分享给大家供大家参考,具体如下: PS:这里再为大家提供2款非常方便的正则表达式工具供大家参考使用: JavaScript正则表达式在线测试工具: http://tools.jb51.net/regex/javascrip
上下文:我需要拆分太长的字符串,这些字符串用作html表中的列标题。这些字符串是变量名,因此它们中没有空格。 如果让css属性执行此操作,则字符串将在固定位置拆分,而不是使用字符串中的点或。 例如,假设我有以下字符串: 使用点作为分隔符,我可以用很多很多不同的方法来分割它。但我提出了以下指导原则: 所有子串必须为12个字符或更少 分隔符[。_]应该在子字符串的末尾,而不是开头 子串的数量必须最小
问题内容: 我需要在给定正则表达式的字符串中找到所有匹配项。我一直在这样做,直到遇到一个案例,它没有达到我的预期。例如: 在这种情况下,返回我需要的内容(最长的匹配项),但是行为却有所不同,尽管文档暗示它应该是相同的: 匹配所有出现的模式,而不仅仅是第一个。 为什么行为不同? 如何获得with (或其他方式)的结果? 问题答案: 好的,我从文档中查看发生了什么…… 如果该模式中存在一个或多个组,则
问题内容: 我有一个模式定义为的猫鼬模型- 并且模型定义为- 现在我想从请求对象参数中搜索标题,标签,描述字段,例如 现在,我如何确保也包括任何在标题或描述中找到该术语的结果,而不仅是两个结果都存在。另外,如何在标签数组中搜索匹配的字符串 问题答案: 您可以在猫鼬中使用 $ or 运算符返回匹配项 $ or http://docs.mongodb.org/manual/reference/oper
本文向大家介绍中文正则表达式匹配问题之正则表达式中文匹配使用方法,包括了中文正则表达式匹配问题之正则表达式中文匹配使用方法的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要讲如何使用正则匹配中文字符,中文正则表达式的匹配规则不像其他正则规则一样容易记住,下面一起看看这个中文正则表达式是怎么样的。 \w匹配的仅仅是中文,数字,字母,对于国人来讲,仅匹配中文时常会用到,见下 匹配中文字符的正则表达