Francesco Marchioni
Francesco Marchioni

Reputation: 4338

Extract values from a property file using bash

I have a variable which contains key/values separated by space:

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 

I'd need to extract the values of the single keys, for example db.jdbc_url. Using one code snippet I've found:

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

but that returns also other properties found before my key. Any help how to fix it ? Thanks

Upvotes: 2

Views: 343

Answers (3)

Aserre
Aserre

Reputation: 5072

This is caused because you are using the substitute command (sed s/.../.../), so any text before your regex is kept as is. Using .* before db\.jdbc_url along with the begin (^) / end ($) of string marks makes you match the whole content of the variable.

In order to be totaly safe, your regex should be :

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

Upvotes: 1

iamauser
iamauser

Reputation: 11489

If db.name always follow db.jdbc_url, then use grep lookaround,

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

or add the VAR to an array,

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

Upvotes: 2

Nic3500
Nic3500

Reputation: 8621

You can use grep for this, like so:

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

The regex is very close to the one you used with sed. The -o option is used to print the matched parts of the matching line.

Edit: if you want only the value, cut on the '='
Edit 2: egrep say it is deprecated, so use grep -oE instead, same result. Just to cover all bases :-)

Upvotes: 1

Related Questions