Linux中模式匹配后grep和打印下一个单词的2种方法
在Linux中,有多种方法可以在模式匹配之后打印下一个单词,或者在模式匹配之前打印上一个单词,但是在本文中,我们将重点介绍grep
和awk
命令以及其他正则表达式。
我们将在本文中介绍以下主题
模式匹配后打印下一个单词
在模式匹配之前打印最后一个单词
模式匹配后,按行打印所有内容
在两个匹配的图案之间打印内容
使用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