我有一个包含多行的文件。我只想从那个输出中得到一些东西。下面是我从服务器获得的输出。
输出:
"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"
]
}
答案 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"
]
}