shell脚本如何通过传递变量来捕获多行

时间:2019-12-20 04:36:20

标签: regex awk sed grep

sample.txt文件的内容是

pool abc {
        members {
            bc:x {
                address 1.2.3.4
            }
            cc:x {
                address 5.6.7.8           }
        }
        monitor x
    }
    pool cc {
        members {
            bc:x {
                address x.x.x.x
                state up
            }
        }
        monitor x
    }

我要从上面的sample.txt文件中收集一些特定数据-条件是

a。它应该在池abc大括号内。即pool abc {....}

b。数据是IP地址-在内部称为地址x.x.x.x

例如,将值“ abc”作为变量值传递时,输出应为:

1.2.3.4
5.6.7.8

注意-这里的“ abc”是变量的值,需要将其传递给执行上述任务的脚本。 我已尝试将正则表达式作为:cat sample.txt | grep -P "abc {([\S\s]*)}"-不起作用

带有sed和awk的

无法应用逻辑。

1 个答案:

答案 0 :(得分:1)

请您尝试使用GNU awk和仅提供的示例进行以下操作,编写和测试。

var="abc"
awk -v var="$var" -v pool="pool" -v RS="" '
match($0,pool " " var".*}$"){
  for(i=1;i<=NF;i++){
    if($i=="address" && $(i+1)~/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/){
      print $(i+1)
    }
  }
}
' Input_file