使用bash从属性文件中提取值

时间:2018-09-24 14:37:04

标签: bash

我有一个变量,其中包含用空格分隔的键/值:

echo $PROPERTY 

server_geo=BOS db.jdbc_url=jdbc\:mysql\://mysql-test.com\:3306/db02 db.name=db02 db.hostname=/mysql-test.com datasource.class.xa=com.mysql.jdbc.jdbc2.optional.MysqlXADataSource server_uid=BOS_mysql57 hibernate33.dialect=org.hibernate.dialect.MySQL5InnoDBDialect hibernate.connection.username=db02 server_labels=mysql57,mysql5,mysql db.jdbc_class=com.mysql.jdbc.Driver db.schema=db02 hibernate.connection.driver_class=com.mysql.jdbc.Driver uuid=a19ua19 db.primary_label=mysql57 db.port=3306 server_label_primary=mysql57 hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect 

我需要提取单个键的值,例如 db.jdbc_url 。 使用一个代码段,我发现:

echo $PROPERTY | sed -e 's/ db.jdbc_url=\(\S*\).*/\1/g'

但这还会返回在我的密钥之前找到的其他属性。 任何帮助如何解决它? 谢谢

3 个答案:

答案 0 :(得分:2)

如果db.name始终跟随db.jdbc_url,则使用grep lookaround

$ echo "${PROPERTY}" | grep -oP '(?<=db.jdbc_url=).*(?=db.name)'
jdbc\:mysql\://mysql-test.com\:3306/db02

或将VAR添加到数组中,

$ myarr=($(echo $PROPERTY))
$ echo "${myarr[1]}" | grep -oP '(?<=db.jdbc_url=).*(?=$)'
jdbc\:mysql\://mysql-test.com\:3306/db02

答案 1 :(得分:1)

您可以为此使用grep

echo $PROPERTY | grep -oE "db.jdbc_url=\S+" | cut -d'=' -f2

正则表达式非常接近您与sed一起使用的正则表达式。 -o选项用于打印匹配行的匹配部分。

编辑:如果只需要该值,请剪切'='
编辑2 egrep说它已过时,因此使用grep -oE,结果相同。只是为了涵盖所有基础:-)

答案 2 :(得分:1)

这是由于您使用替代命令(sed s/.../.../)引起的,因此正则表达式之前的所有文本均保持原样。在.*之前使用db\.jdbc_url以及字符串标记的开始(^)/结束($),可以使变量的全部内容匹配。

为了完全安全,您的正则表达式应为:

sed -e 's/^.*db\.jdbc_url=\(\S*\).*$/\1/g'