我想替换yml文件中每个日志的路径,下面是我的文件
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/*.log我不知道如何替换具有多个相同类型的值,即-type: log,对于示例文件,我使用了以下行:
sed -i -e '/^ *ssl:/,/^ *[^:]*:/s/enabled: true/enabled: false/' test2.yaml 更改内容后,它应该如下所示:
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/spark/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/kafka/*.log发布于 2019-03-31 00:01:34
您应该使用真正的解析器从YAML获取值,或者更新YAML文件。对于这种复杂的操作,sed不是合适的工具,特别是当有人在fields.type和paths行之间插入另一个键值对,或者在序列中附加一个路径的值的时候。
假设您在安装了ruamel.yaml (pip install ruamel.yaml)和脚本的input.yaml文件中输入:
import sys
import ruamel.yaml
yaml = ruamel.yaml.YAML()
data = yaml.load(sys.stdin)
for item in data['filebeat.inputs']:
try:
ft = item['fields.type']
paths = item['paths']
for idx, path in enumerate(paths):
pre, post = path.rsplit('/', 1)
paths[idx] = pre + '/' + ft + '/' + post
except Exception as e:
print(e)
pass
yaml.dump(data, sys.stdout)您可以执行以下操作:
< input.yaml python update.py > output.yaml要获得以下信息:
filebeat.inputs:
- type: log
enabled: true
fields.type: spark
paths:
- /var/log/spark/*.log
- type: log
enabled: true
fields.type: kafka
paths:
- /var/log/kafka/*.log如果paths下有多个项目,它们都会更新(假设路径中至少有一个/ )。
发布于 2019-04-09 13:47:25
您不能直接通过sed命令来实现这一点。您需要执行YAML解析,并根据您的需求,对解析后的数据调用必要的sed命令。
https://stackoverflow.com/questions/55419669
复制相似问题