【shell-13】shell解析配置文件(正则)

说明

以下代码适合在大型框架性应用中使用,摘抄自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 命令的正则表达式以适应实际的结构。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我先森

鼓励一个吧,哈哈

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值