我有一个像这样的文件:

[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

  • 还有其他建议吗? sedawk,不要使用一长串命令。

    最佳答案

    如果您知道组始终由空行分隔,请将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/

    10-14 01:05