Linux中模式匹配后grep和打印下一个单词的2种方法

时间:2020-02-23 14:40:16  来源:igfitidea点击:

在Linux中,有多种方法可以在模式匹配之后打印下一个单词,或者在模式匹配之前打印上一个单词,但是在本文中,我们将重点介绍grepawk命令以及其他正则表达式。

我们将在本文中介绍以下主题

  • 模式匹配后打印下一个单词

  • 在模式匹配之前打印最后一个单词

  • 模式匹配后,按行打印所有内容

  • 在两个匹配的图案之间打印内容

使用grep,我们可以使用超前查找。

对于正的lookahead,q(?= u)会匹配q,后面跟一个u,而不会使u成为匹配的一部分。
正向" lookbehind"的构造是一对圆括号(?<= text),圆括号的开头是问号,"小于"符号和等号。

1.使用grep在模式匹配后打印下一个单词

1.1使用后向

让我们看一些在模式匹配后打印下一个单词的示例。
在下面的示例中,我在模式匹配后打印下一个单词,即field3

# echo "field1 field2 field3 field4" | grep -oP '(?<=field3 )[^ ]*'
field4

类似地,在field2的模式匹配之后打印下一个单词

# echo "field1 field2 field3 field4" | grep -oP '(?<=field2 )\w+'
field3

1.2使用perl扩展模式

现在,我们将使用perl扩展模式在模式匹配后打印下一个单词。

# echo "field1 field2 field3 field4" | grep -oP 'field3 \K\w+'
field4

这里的\ K表示保留\ K的内容,不要将其包含在$&中,而\ w表示匹配单词字符

一些更多的例子:

# echo "field1 field2 field3 field4" | grep -oP 'field1 \K\w+'
field2
# echo "field1 field2 field3 field4" | grep -oP 'field2 \K\w+'
field3

2.模式匹配后打印下一个单词

2.1使用awk

我们展示了使用grep在模式匹配后打印下一个单词的各种示例,现在我们将对awk进行相同的操作

# echo "field1 field2 field3 field4" | awk '{if(/field2/) print  " " }'
field4 field2
# echo "field1 field2 field3 field4" | awk '{if(/field2/) print }'
field4

其他示例:如果第一个字段是field1,则print $2

# echo "field1 field2 field3 field4" | awk ' == "field1" {print }'
field2
# echo "field1 field2 field3 field4" | awk ' == "field2" {print }'
field3

3.模式匹配后,按行打印所有内容

现在,通过" lookbehind",我展示了一些示例,这些示例在模式匹配后打印下一个单词,但在模式匹配后打印所有内容

# echo "field1 field2 field3 field4" | grep -oP '(?<=field2 ).*'
field3 field4

稍作调整的其他示例

# echo "field1 field2 : field3 field4" | grep -oP '(?<=field2\s: )[^ ]*'
field3

其中我们使用\ s来匹配空格字符

4.在两个匹配的图案之间打印内容

现在我们可以同时使用lookahead和lookbehind在两个匹配的模式之间打印内容。
其中我希望在" field1"和" field3"之间打印文本

# echo "field1 field2 field3 field4" | grep -oP '(?<=field1 )\w+(?= field3)'
field2

我们可以使用perl扩展模式来做同样的事情

# echo "field1 field2 field3 field4" | grep -oP 'field1 \K\w+(?= field3)'
field2

5.使用带有预读功能的grep在模式匹配之前打印最后一个单词

类似于lookbehind,我们可以使用lookahead使用grep在模式匹配之前打印最后一个单词

# echo "field1 field2 field3 field4" | grep -oP '\w+(?= field3)'
field2

6.在模式匹配之前打印所有内容

要在模式匹配之前在Linux中打印所有内容,可以在正则表达式下面使用lookahead

# echo "field1 field2 field3 field4" | grep -oP '.*(?= field3)'
field1 field2

7.模式匹配后,按行打印所有内容

现在,我们还可以使用lookbehind或者其他正则表达式在模式匹配后在线打印所有内容

# echo "field1 field2 field3 field4" | grep -o "field2.*"
field2 field3 field4

在匹配前在线打印所有内容

# echo "field1 field2 field3 field4" | grep -o ".*field2"
field1 field2