如何从多行开始并格式化它们

时间:2016-08-22 06:20:22

标签: awk sed grep

我有一个包含多行的文件。我只想从那个输出中得到一些东西。下面是我从服务器获得的输出。

输出:

      "az": "nova", 
      "cloud": "envvars", 
      "config_drive": "", 
      "created": "2016-08-19T17:21:24Z", 
      "flavor": {
        "id": "4", 
        "name": "m1.large"
      }, 
      "hostId": "f714baee5967dc17e7d36c7b72eb92a4f1ab68d9782fa90a968ceae5", 
      "human_id": "dsc-test-3", 
      "id": "3f0a1188-c151-4e5e-9930-969d0423601b", 
      "image": {
        "id": "7f4ad1f4-6fab-4978-b65a-ec4b9a407c5c", 
        "name": "mitel-dsc-7.9-9.15_3nic"
      }, 
      "interface_ip": "172.16.17.15", 
      "key_name": "key1", 
      "metadata": {}, 
      "name": "dsc-test-3", 
      "networks": {
        "dsc-InterInstance": [
          "172.16.18.15"
        ], 
        "dsc-OAM": [
          "172.16.16.20"
        ], 
        "dsc-sig": [
          "172.16.17.15", 
          "10.10.72.15"
        ]
      }, 

我的目的是得到以下内容

必需:

    "networks": {
    "dsc-InterInstance": [
      "172.16.18.15"
    ], 
    "dsc-OAM": [
      "172.16.16.20"
    ], 
    "dsc-sig": [
      "172.16.17.15", 
      "10.10.72.15"
    ]
  }

4 个答案:

答案 0 :(得分:2)

试试这个方法

sed -n  '/networks.*{/,/}/p' fileName

<强>输出:

 "networks": {
    "dsc-InterInstance": [
      "172.16.18.15"
    ], 
    "dsc-OAM": [
      "172.16.16.20"
    ], 
    "dsc-sig": [
      "172.16.17.15", 
      "10.10.72.15"
    ]
  }

答案 1 :(得分:0)

Awk解决方案:

awk '/"networks"/,/}/' file.txt

这给出了输出

"networks": {
  "dsc-InterInstance": [
    "172.16.18.15"
  ], 
  "dsc-OAM": [
    "172.16.16.20"
  ], 
  "dsc-sig": [
    "172.16.17.15", 
    "10.10.72.15"
  ]
},

此处使用的语法是/start_regex/,/stop_regex/,当行与start_regex匹配时开始匹配,并在行匹配stop_regex后停止匹配(因此其间的所有行也匹配)。由于未指定任何操作,因此使用默认的{print}操作。

与您的要求相比,这会在最后一行输出额外的,,因为该逗号存在于输入中。如果这是不可接受的,你可以使用动作{sub("},","}");print}摆脱它。或者在另一个答案中使用sed

答案 2 :(得分:0)

...以及标记的$ cat file|tr '\n' _| grep -o \[^_\]*\"networks\"\[^}\]*}|tr _ '\n' "networks": { "dsc-InterInstance": [ "172.16.18.15" ], "dsc-OAM": [ "172.16.16.20" ], "dsc-sig": [ "172.16.17.15", "10.10.72.15" ] } 解决方案:

\n

即。将所有_更改为grep,将\n更改为请求的块,然后将_更改回来。 {{1}}可能不是替代品的最佳选择,但适用于这种特殊情况。

答案 3 :(得分:0)

使用GNU awk进行多字符RS和RT,您只需使用正则表达式来描述您正在寻找的字符串:

$ awk -v RS='"networks": {[^}]+}' 'RT{print RT}' file
"networks": {
        "dsc-InterInstance": [
          "172.16.18.15"
        ],
        "dsc-OAM": [
          "172.16.16.20"
        ],
        "dsc-sig": [
          "172.16.17.15",
          "10.10.72.15"
        ]
      }