使用基本Linux正则表达式的示例

时间:2020-03-21 11:43:30  来源:igfitidea点击:

Linux正则表达式在处理从文件中提取文本,对命令结果的输出进行排序,对某些任务进行脚本编写等工作时非常有用。
我相信正则表达式有点难以掌握,因为它们可以以多种方式使用。
不赞成使用某些表达式,而为了保持向后兼容性,仍保留一些表达式。

我们将在此处介绍一些使用正则表达式的最常用和非常有用的方法。

1.使用锚字符^和$。

^(脱字符号)用于匹配行首的字符。

$(美元符号)用于匹配行 tail的字符。

让我们看一个例子。

我有一个名为“测试”的文件,其中包含以下内容

因此,要grep出以字符“ a”开头的行,我将执行以下操作。

[root@myvm1 ~]# grep "^a" testing
a
abc
abcd
abcdef
abcdefg

现在要删除没有字符的行或者说空行,我们将执行以下操作。

[root@myvm1 ~]# grep -c "^$" testing
3

现在只需简单地在grep中使用-c选项进行计数,grep就会在屏幕上输出空白行(这是无用的)。

“ ^ a”将输出带有bigininng的行

“ a $”将匹配以a结 tail的行

“ ^^”将匹配行中包含插入符号的行

2.找到仅一个字符的行

[root@myvm1 ~]# grep "^.$" testing
a
d

上面显示的示例中带有“ ^。
$”的此处为“.”字符将匹配一个字符,因此简而言之,上述表达式将匹配一个字符的行。

3.匹配介于字符之间或者字符范围内的字符

匹配一系列字符可以在表达式[...]的帮助下完成

如果要匹配仅包含一个数字的任何行,则可以使用以下表达式进行匹配。

[root@myvm1 ~]# grep "^[0123456789]$" testing
[root@myvm1 ~]#

在我们的例子中,它没有显示任何输出,因为我们的文件“ testing”没有包含以数字开头的任何行,并且该行中仅包含一个数字。

现在,如果我们要匹配一个字母,数字或者符号的字符,我们可以执行以下操作。

[root@myvm1 ~]# grep "[0-9a-zA-Z]" testing
a
abc
abcd
abcdef
abcdefg
sd
sd
d

请注意,输出未在文件中显示空行。

在继续之前,有一些要理解的要点。

[0-9]匹配任何数字

[^ 0-9]-将匹配任何字符而不是数字((当放在[]方括号内时,^的含义发生变化,在squire方括号外则表示行的开头)

4,在正则表达式中使用星号

字符“ *”匹配零个或者多个。
因此我们可以说正则表达式[0-9] *将匹配零个或者多个数字结果。

让我们看一个例子。

[root@myvm1 ~]# grep "^a*" testing
a
abc
abcd
abcdef
abcdefg
sd
sd
d

因为*表达式将匹配零个或者多个匹配所有行的匹配项,结果类似于“cat 测试”

5.指定正则表达式中的最大出现次数

现在*将grep输出匹配零次或者多次的模式,但是没有可其中指定的上限或者下限。

要在搜索模式时指定上限和下限,我们可以使用“ \ {”和“ }”。

现在让我们了解为什么要使用反斜杠。
为了匹配一个时期,我们需要按照以下方式进行匹配

“ .”因为我们需要首先关闭简单“.”的含义。

星号与*匹配,否则shell会认为我们发现了零个或者多个出现(*的原始含义)

[root@myvm1 ~]# grep "s\{1,2\}" testing
sd
sd

上面显示的示例将匹配包含一个或者最多两个出现次数或者“ s”的任何行,可以使用\ {,和}设置下限和上限。

6.匹配词。

匹配的单词可以使用字符“ \ <”和“ >”来完成。

[root@myvm1 ~]# grep "\<abc\>" testing
abc

也可以使用正则表达式“ abc”完成单词的搜索,但也可以匹配abcdef中的abc。
我将显示使用“ abc”而不是“ \ <abc >”的示例。

[root@myvm1 ~]# grep "abc" testing
abc
abcd
abcdef
abcdefg

7,在正则表达式中使用+ operator

就像*字符匹配零个或者多个结果,+字符匹配提到的字符之一。

例如。

[root@myvm1 ~]# grep "[a]\+" testing
a
abc
abcd
abcdef
abcdefg

8.搜索以不同模式结 tail的文件。

假设我们要在几个文件中搜索某些文件,这些文件被命名为messages,messages.1,messages.2等。
我们可以通过以下技术来做到这一点。

[root@myvm1 log]# grep usb messa*.[0-9]

通过上述方法,我们只能在以messa开头并以数字结 tail的文件中搜索单词。

9.使用“ |”或者搜索模式中的运算符。

找出使用b或者s放大的行,我们需要使用|正则表达式中可用的运算符。

[root@myvm1 ~]# grep "^[b|s]" testing
sd
sd

在上面的示例中,文件“ testing”中只有两行以s开头,没有行以b开头