我有一个像这样的文件:
[group]
enable = 0
name = green
test = more
[group]
name = blue
test = home
[group]
value = 48
name = orange
test = out
标签与
=
和值之间可能有一个或多个空格/制表符。每行中的行数可能会有所警惕。
我喜欢拥有
name
,仅当这不是真的enable = 0
时因此输出应为:
blue
orange
这是我设法创建的:
awk -v RS="group" '!/enable = 0/ {sub(/.*name[[:blank:]]+=[[:blank:]]+/,x);print $1}'
blue
orange
这有几个缺点:
RS
设置为[group]
,这都使RS="[group]"
和RS="\[group\]"
都失败了。如果name
或其他标签包含group
,则此操作将失败。 RS
与多个字符一起使用,因为这仅是gnu awk
。 还有其他建议吗?
sed
或awk
,不要使用一长串命令。 最佳答案
如果您知道组始终由空行分隔,请将RS
设置为空字符串:
$ awk -v RS="" '!/enable = 0/ {sub(/.*name[[:blank:]]+=[[:blank:]]+/,x);print $1}'
blue
orange
@devnull在他的回答中解释说,GNU awk还接受
RS
中的正则表达式,因此,如果它在自己的行上,则只能在[group]
处拆分:gawk -v RS='(^|\n)[[]group]($|\n)' '!/enable = 0/ {sub(/.*name[[:blank:]]+=[[:blank:]]+/,x);print $1}'
这可以确保我们不会在诸如
[group]
enable = 0
name = [group]
name = evil
test = more
关于bash - 如何根据条件从数据块中获取特定数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21968498/