如何使用awk和regexp获取匹配的项目?

时间:2014-12-09 00:52:46

标签: regex awk

我正在尝试解析“/ boot / grub / grubenv”,但在regexp上真的不太好。

假设/ boot / grub / grubenv的内容是:

saved_entry=1

我想输出数字“1”,如下所示。我目前正在使用“awk”,但对其他工具开放。

$ awk '/^(saved_entry=)([0-9]+)/ {print $2}' /boot/grub/grubenv

但显然不行,谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

使用-F选项指定字段分隔符:

awk -F= '/^saved_entry=/ {print $2}' /boot/grub/grubenv

$1$2,..此处代表字段(由=分隔),而不是对已捕获组的反向引用。

答案 1 :(得分:0)

如果你想匹配最好使用match的东西!
即使之后有更多字段并且不需要您更改字段分隔符(包括您正在对数据执行任何其他操作),这也将起作用。

此方法的唯一缺点是它只匹配记录的最左侧匹配,因此如果数据在同一记录(行)中出现两次,那么它将只匹配它找到的第一个。

  awk 'match($0,/^(saved_entry=)([0-9]+)/,a){print a[2]}' file

实施例

输入

saved_entry=1 blah blah more stuff

输出

1

解释

匹配$0(记录)中的正则表达式,然后将括号中的任何内容存储为单独的数组元素。

从示例中可以看出这些输出

a[0]saved_entry=1
a[1]saved_entry= a[2]1