在配置文件的一行中选取数据库名称

在配置文件的一行中选取数据库名称

我有这个 jdbc 文件行

<url>jdbc:oracle:thin:@192.168.1.70:1521:MYDBORA</url>

我需要使用某种实用程序来捕获该MYDBORA部分,但它并不总是相同的名称。我需要1521:和之间的部分</url>

  • 我努力了
    grep 1521 config_file.xml | sed 's/.*://' |grep -o -P '.0,6</url'
    
    我没有得到任何回报*我也尝试过:
    grep 1521 config_file.xml | cut -d ':' -f 6
    
    我明白了
    MYDBORA<url>
    

我只想要数据库的名称,并不总是 5 个字符,而是1521:和之间的所有内容<url>

文件提取:

<?xml version="1.0" encoding="UTF-8"?>
<jdbc-data-source xmlns="xmlns.oracle.com/weblogic/jdbc-data-source">
  <name>assetmanagement-xa-ds</name>
  <jdbc-driver-params>
    <url>jdbc:oracle:thin:@192.168.1.70:1521:DB_NAME</url>
    <driver-name>oracle.jdbc.xa.client.OracleXADataSource</driver-name>
    <properties> 
...

答案1

由于这是 JDBC 并且您正在处理 XML 文件,因此您可以使用它xmlstarlet可靠地挑选出必要的元素,而无需考虑空格或其他不相关的格式

使用来自的示例JDBC 文档,挑选<connection-url/>就这么简单

xmlstarlet sel -t -v '//connection-url' -n config_file.xml
jdbc:oracle:thin:@%hostname%:%port%:%database sid%

在你的情况下,你需要使用<url/>而不是<connection-url/>相应地替换。然后您可以选择最后一个冒号:分隔字段

xmlstarlet sel -t -v '//url' -n config_file.xml | awk -F: '{print $NF}'
MYDBORA

答案2

使用专用解析器始终是更安全、更强大的选择,但这里有另一个可行的解决方案,除非您的数据比您显示的要多变:

$ grep -oP '<url>.*:\K[^<]+' file
MYDBORA

答案3

使用 Raku(以前称为 Perl_6):

从 jdbc-data-source.xml 文件开始https://stackoverflow.com/a/39994984/7270649,并使用XMLRaku 模块:

~$ raku -MXML -e 'my $xml=from-xml-file($*ARGFILES.Str); put $xml.elements(:TAG<url>, :RECURSE(Inf), :SINGLE);' jdbc-data-source.xml
<url>jdbc:oracle:thin:@host:port:db</url>

然后使用以下方法提取单个数据元素就足够简单了.contents.split(":")

~$ raku -MXML -e 'my $xml=from-xml-file($*ARGFILES.Str); put $xml.elements(:TAG<url>, :RECURSE(Inf), :SINGLE).contents.split(":");' jdbc-data-source.xml
jdbc oracle thin @host port db

最后,只需通过索引获取最后一个db元素,例如使用.tail或数字索引,例如.[*-1]。现在总而言之,作为 Raku 的一句台词:

~$ raku -MXML -e 'my $xml=from-xml-file($*ARGFILES.Str); put $xml.elements(:TAG<url>, :RECURSE(Inf), :SINGLE).contents.split(":").tail;' jdbc-data-source.xml
db

https://raku.org/

相关内容