我们有一个应用程序,它从文件中获取设置参数。我想从启动字符串中提取一两个语句,并将它们呈现为一个漂亮的表格。
示例字符串是 -Dmysql.host=mysql1.company.com,但它也可能是 ipaddress 或机器名称,而不是 fqdn。
我想要找到 -Dmysql.host= 但返回服务器名称。
一旦我在文件中找到字符串“-Dmysql.host=”并显示到下一个空白处,我将非常感激任何关于如何操作的提示或指示。
也许有更好的方法。我计划最终在十几台机器上运行此方法,以便一目了然地返回哪些应用程序机器配置为与哪个数据库机器通信的列表。
感谢您的时间。
答案1
尝试这个:
grep mysql.host file.txt | sed -e 's/.*mysql.host=\(\S*\).*/\1/g'
您最终得到的值应该是 mysql.host 的值。如果您愿意,也可以在匹配中加上 -D,但我把它省略了,因为它是 grep 的一个参数,您需要对其进行转义。
答案2
根据给出的信息,我将首先根据空格拆分所有内容,然后根据 = 符号拆分这些标记。纯 bash 解决方案将类似于以下内容。
foo="bar=baz boo=zip"
for keyvalue in $foo; do
key=${keyvalue%%=*}
value=${keyvalue##*=}
echo $key $value
done
由于 IFS 可能是空格,因此 shell 会根据空格进行拆分。然后,您可以使用参数(变量)扩展来处理基于等号的键/值对拆分。
答案3
如何将文件提供给老式的 sed:
$ echo foo -Dmysql.host=mysql1.company.com -bar | grep -- "-Dmysql.host=" | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'
mysql1.company.com
因此,对于您来说,您可以像这样向其提供文件:
$ grep -- "-Dmysql.host=" FILENAME | sed -e 's/^.*-Dmysql.host=//' -e 's/ .*//'
我意识到其中有一个 grep 可以用 sed 来处理,但是这只是更容易编写,而 sed 可能比较笨拙。