Grep 命令中的正则表达式与10个示例 - 第一部分
正则表达式用于根据模式搜索和操作文本。大多数 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
正则表达式中的第一个插入符号代表行的开头。然而,方括号内的插入符号代表“除外”——即匹配方括号中的所有内容。
- 点赞
- 收藏
- 关注作者
评论(0)