我有一个适用于Java的属性文件,如:
oracle {
username = "bla"
password = "blabla"
driver = "driver1"
}
postgres {
username = "pg"
password = "pg"
driver = "pg-driver"
}
当读入java时,我可以提取返回oracle.driver
的{{1}}属性。
现在我想在bash脚本中提取相同的字符串。
我尝试过类似的东西:
driver1
返回grep -A5 oracle application.conf | grep -Po 'driver = ".*?"' | grep -Po '".*"'
(包括引号)。我也尝试使用"driver1"
,但也没有产生sed substitute
字符串。
如何仅检索driver1
?
答案 0 :(得分:2)
每当你有名字时 - >数据中的值映射,首先创建一个数组来存储这些映射(下面是f[]
)然后通过它的名称访问数据提供了最简单,最清晰和最容易增强的解决方案:
$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["username"]}' file
"bla"
$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["password"]}' file
"blabla"
$ awk -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f["driver"]}' file
"driver1"
$ awk -v name="driver" -v RS= '$1=="oracle"{ for (i=3;i<=NF;i+=3) f[$i]=$(i+2); print f[name]}' file
"driver1"
答案 1 :(得分:1)
使用awk
,您可以使用空记录分隔符执行此操作:
awk -v RS= '/^[[:blank:]]*oracle/{
gsub(/.*driver[[:blank:]]*=[[:blank:]]*|\n.*$|"/, ""); print}' application.conf
driver1
空RS
使所有连续的非空行成为一条记录。
答案 2 :(得分:1)
使用单个 awk
命令 - 可以在任何 awk
实施中使用:
awk '/oracle/{ f=1 }f && $1=="driver"{ gsub(/"/,""); print $3; exit }' file
/oracle/{ f=1 }
- 遇到与模式匹配的行oracle
- 设置有效标记f
f && $1=="driver"
- 如果它是&#34;活跃的&#34;已处理的部分(&#34; oracle&#34;)和第一个字段$1
等于driver
:
gsub(/"/,"")
- 从行print $3
- 打印第三个字段,即驱动程序值exit
- 立即退出脚本执行,避免冗余处理输出:
driver1
答案 3 :(得分:0)
您也可以尝试使用sed
require 'thin'
require 'rack'
class App
def initialize()
puts 'init'
end
def call(env)
puts 'got it'
sleep(60)
[ 200, { "Content-Type" => "text/plain" }, ["hello"] ]
end
end
Rack::Handler::Thin.run(App.new, options = {:Host => '0.0.0.0', :Port => 8083}) do |server|
puts server.class
server.threaded = true
end