说明
以下代码适合在大型框架性应用中使用,摘抄自flink的启动脚本
配置文件格式
# automatically configure the host name based on the hostname of the node where the
# JobManager runs.
akka.client.timeout: 300000
jobmanager.rpc.address: localhost
jobmanager.rpc.port: 6123 # The RPC port where the JobManager is reachable.
java.path: /home/jdk_1.8
解析脚本
KEY_ENV_JAVA_HOME="java.path"
YAML_CONF="/home/conf/dev.yml"
readFromConfig() {
local key=$1
local defaultValue=$2
local configFile=$3
local value=`sed -n "s/^[ ]*${key}[ ]*: \([^#]*\).*$/\1/p" "${configFile}" | sed "s/^ *//;s/ *$//" | tail -n 1`
[ -z "$value" ] && echo "$defaultValue" || echo "$value"
}
调用
# read JAVA_HOME from config with no default value
MY_JAVA_HOME=$(readFromConfig ${KEY_ENV_JAVA_HOME} "" "${YAML_CONF}")
echo "$MY_JAVA_HOME"
输出结果为: /home/jdk_1.8
代码说明
- sed: 是一个流编辑器,用于对输入流(或文件)进行基本的文本转换。
- -n: 默认sed会输出整个文档,以及你从文档中匹配的值。-n可只输出你查找的值。
- s/^[ ]*${key}[ ]*: ([^#]*).*$/\1/p: 这是一个 sed 的替换(s/{}/{}/)命令,它执行以下操作:
- ^[ ]*: 匹配行首的任意数量的空格。
- ${key}: 这是一个 Bash 变量,它将被替换为 key 变量的实际值。
- [ ]*:: 匹配键(${key})后面的任意数量的空格和一个冒号。
- ([^#]*): 这是一个捕获组,匹配非 # 字符的任意序列。这个()组中是要提取的value值。
- .*$: 匹配从捕获组后面的任意字符直到行尾,也就是从 #到行尾,#之前的内容包含在上一个捕获组中
- /\1/: 替换整个匹配的内容为捕获的内容(即值)。
- p: 打印替换后的行。
- “${configFile}”: 是要处理的配置文件的路径。
- | sed “s/^ *//;s/ *$//”
- |是管道符,用于将上一个一个命令的输出作为另一个命令的输入,在这里上一个命令输出是匹配到的value
- sed “s/^ *//;s/ *$//”: 这是另一个 sed 命令,用于进一步处理匹配到的value字符串。
- s/^ *//: 移除行首的任意数量的空格。^和*之间是一个空格
- s/ *$//: 移除行尾的任意数量的空格。/和*之间是一个空格
- tail -n 1
- tail: sed命令查找配置文件的时候如果某个key出现多次,则用tail -n可确保取最后一行数据。
- -n 1: 选项告诉 tail 只输出最后一行。有多行匹配时用于只获取最后一个匹配项。
- 最后,整个命令的输出(即提取的值)被赋值给 value 变量。这段代码假设配置文件中的键值对是独占一行的,并且键后面紧跟一个冒号和空格,然后是值。如果配置文件的结构有所不同,那么可能需要调整 sed 命令的正则表达式以适应实际的结构。