Grep 命令中的正则表达式与10个示例 - 第一部分

举报
Tiamo_T 发表于 2021/08/30 13:51:01 2021/08/30
【摘要】 正则表达式用于根据模式搜索和操作文本。大多数 Linux 命令和编程语言都使用正则表达式。当您想要搜索包含特定模式的文本时,您还可以将正则表达式与 grep 命令一起使用。正则表达式搜索文件每一行的模式。它简化了我们的搜索操作。这篇文章是 2 篇文章系列的一部分。第 1 部分文章涵盖了简单正则表达式的 grep 示例。未来的第 2 部分文章将介绍 grep 中的高级正则表达式示例。让我们以将...

正则表达式用于根据模式搜索和操作文本。大多数 Linux 命令和编程语言都使用正则表达式。

当您想要搜索包含特定模式的文本时,您还可以将正则表达式与 grep 命令一起使用。正则表达式搜索文件每一行的模式。它简化了我们的搜索操作。

这篇文章是 2 篇文章系列的一部分。

第 1 部分文章涵盖了简单正则表达式的 grep 示例。未来的第 2 部分文章将介绍 grep 中的高级正则表达式示例。

让我们以将在我们的示例中使用的文件 /var/log/messages 为例。

示例 1. 行首 ( ^ )

在 grep 命令中,插入符号 ^ 匹配行首的表达式。在下面的例子中,它显示所有以 11 月 10 日开始的行。即所有在 11 月 10 日记录的消息。

$ grep "^Nov 10" messages.1
Nov 10 01:12:55 gs123 ntpd[2241]: time reset +0.177479 s
Nov 10 01:17:17 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 01:18:49 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3
Nov 10 13:21:26 gs123 ntpd[2241]: time reset +0.146664 s
Nov 10 13:25:46 gs123 ntpd[2241]: synchronized to LOCAL(0), stratum 10
Nov 10 13:26:27 gs123 ntpd[2241]: synchronized to 15.1.13.13, stratum 3

^ 匹配行首的表达式,仅当它是正则表达式中的第一个字符时。^N 匹配以 N 开头的行。


示例 2. 行尾 ($)

字符 $ 匹配行尾的表达式。以下命令将帮助您获取所有以“终止”一词结尾的行。

$ grep "terminating.$" messages
Jul 12 17:01:09 cloneme kernel: Kernel log daemon terminating.
Oct 28 06:29:54 cloneme kernel: Kernel log daemon terminating.

从上面的输出中,您可以知道所有内核日志何时终止。就像 ^ 仅当它是第一个字符时才匹配行首一样,$ 仅当它是正则表达式中的最后一个字符时才匹配行尾。

示例 3. 空行数 ( ^$ )

使用 ^ 和 $ 字符可以找出文件中可用的空行。“^$”指定空行。

$ grep -c  "^$" messages anaconda.log
messages:0
anaconda.log:3

上述命令显示消息和 anaconda.log 文件中可用的空行数。

示例 4. 单个字符 (.)

特殊元字符“.” (dot) 匹配除行尾字符以外的任何字符。让我们以具有如下内容的输入文件为例。

$ cat input
1. first line
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello
7. last line

现在让我们搜索一个单词,其中包含任何单个字符后跟 ello。即你好,大提琴等,

$ grep ".ello" input
2. hi hello
3. hi zello how are you
4. cello
5. aello
6. eello

如果你想搜索一个只有 4 个字符的单词,你可以给 grep -w “....” 其中单点代表任何单个字符。

示例 5. 零次或多次出现 (*)

特殊字符“*”匹配零次或多次出现的前一个字符。例如,模式“1*”匹配零个或多个“1”。

以下示例搜索模式“kernel: *”,即 kernel: 和零个或多个空格字符。

$ grep "kernel: *." *
messages.4:Jul 12 17:01:02 cloneme kernel: ACPI: PCI interrupt for device 0000:00:11.0 disabled
messages.4:Oct 28 06:29:49 cloneme kernel: ACPI: PM-Timer IO Port: 0x1008
messages.4:Oct 28 06:31:06 btovm871 kernel:  sda: sda1 sda2 sda3
messages.4:Oct 28 06:31:06 btovm871 kernel: sd 0:0:0:0: Attached scsi disk sda
.
.

在上面的示例中,它匹配内核和冒号符号,后跟任意数量的空格/无空格和“。” 匹配任何单个字符。

示例 6. 一次或多次出现 (\+)

特殊字符“\+”匹配前一个字符的一个或多个出现。“\+”匹配至少一个或多个空格字符。

如果没有空格,则它将不匹配。字符“+”属于扩展正则表达式。所以当你想用 grep 命令使用它时你必须转义。

$ cat input
hi hello
hi    hello how are you
hihello

$ grep "hi \+hello" input
hi hello
hi    hello how are you

在上面的示例中,grep 模式匹配模式 'hi',后跟一个或多个空格字符,后跟“hello”。

如果 hi 和 hello 之间没有空格,则不会匹配。但是,* 字符匹配零次或多次出现。

“hihello”将被*匹配,如下所示。

$ grep "hi *hello" input
hi hello
hi    hello how are you
hihello
$

示例 7. 零次或一次出现 (\?)

特殊字符“?” 匹配前一个字符的零次或一次出现。“0?” 匹配单个零或不匹配。

$ grep "hi \?hello" input
hi hello
hihello

“hi \?hello”匹配带有单个空格 (hi hello) 和没有空格 (hihello) 的 hi 和 hello。

hi 和 hello 之间有一个以上空格的行在上述命令中没有匹配。

示例 8.转义特殊字符 (\)

如果要在内容中搜索特殊字符(例如: * 、点),则必须对正则表达式中的特殊字符进行转义。

$ grep "127\.0\.0\.1"  /var/log/messages.4
Oct 28 06:31:10 btovm871 ntpd[2241]: Listening on interface lo, 127.0.0.1#123 Enabled

示例 9. 字符类 ([0-9])

字符类只不过是方括号中提到的字符列表,用于仅匹配几个字符中的一个。

$ grep -B 1 "[0123456789]\+ times" /var/log/messages.4
Oct 28 06:38:35 btovm871 init: open(/dev/pts/0): No such file or directory
Oct 28 06:38:35 btovm871 last message repeated 2 times
Oct 28 06:38:38 btovm871 pcscd: winscard.c:304:SCardConnect() Reader E-Gate 0 0 Not Found
Oct 28 06:38:38 btovm871 last message repeated 3 times

重复的消息将记录在消息日志文件中,作为“最后一条消息重复 n 次”。上面的示例搜索具有任意数字 (0to9) 后跟单词“times”的行。如果匹配,则显示匹配行之前的行和匹配行。

在方括号中,使用连字符可以指定字符范围。像[0123456789]可以用[0-9]表示。也可以指定字母范围,如[az],[AZ]等,所以上面的命令也可以写成

$ grep -B 1 "[0-9]\+ times" /var/log/messages.4

示例 10. 字符类中的异常

如果要搜索除方括号中的字符之外的所有字符,则使用 ^(插入符号)作为开方括号后的第一个字符。以下示例在 linux 中从字典单词文件中搜索不以元音字母开头的行。

$ grep -i  "^[^aeiou]" /usr/share/dict/linux.words
1080
10-point
10th
11-point
12-point
16-point
18-point
1st
2

正则表达式中的第一个插入符号代表行的开头。然而,方括号内的插入符号代表“除外”——即匹配方括号中的所有内容。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。