寻求Unix Shell脚本帮助:转换Jenkins URL至指定路径格式
解决Jenkins URL到日志路径的转换问题
我来帮你搞定这个Shell脚本的转换需求。基于你已经完成的第一步截取,我们可以通过组合几个文本处理命令,一步到位得到目标格式的日志路径。
完整解决方案
# 假设你的Jenkins URL已经存在于变量build_url_val中 build_url_val="https://jenkinsurl.com/job/GitHub%20Organization%20Scans/job/Project_Dev/job/reponame/job/dev/72/" # 生成最终的日志路径 final_log_path=$(printf "%b" "$(echo "$build_url_val" | cut -d'/' -f5-)" | sed -e 's/\(\/\)job\(\/\)/\1jobs\2/g' \ -e 's/jobs\/dev\//branches\/dev\//' \ -e 's/\/[0-9]*\//\/builds\/$BUILD_NUMBER\/log/' | awk '{print "/var/jenkins_home/jobs/"$0}' ) # 输出结果 echo "$final_log_path"
执行后会输出:
/var/jenkins_home/jobs/GitHub Organization Scans/jobs/Project_Dev/jobs/reponame/branches/dev/builds/$BUILD_NUMBER/log
分步解释
- 截取URL核心部分:
cut -d'/' -f5-去掉URL开头的https://jenkinsurl.com/,得到GitHub%20Organization%20Scans/job/Project_Dev/job/reponame/job/dev/72/。 - 解码URL空格:
printf "%b"将URL编码的%20转换为实际空格,处理后变为GitHub Organization Scans/job/Project_Dev/job/reponame/job/dev/72/。 - 替换job为jobs:
sed 's/\(\/\)job\(\/\)/\1jobs\2/g'只替换被斜杠包围的job为jobs,避免误替换路径中包含job的名称,处理后得到GitHub Organization Scans/jobs/Project_Dev/jobs/reponame/jobs/dev/72/。 - 调整分支路径:
sed 's/jobs\/dev\//branches\/dev\//'将分支部分的jobs/dev/替换为目标格式的branches/dev/。 - 替换构建号:
sed 's/\/[0-9]*\//\/builds\/$BUILD_NUMBER\/log/'将最后的数字构建号替换为变量占位符$BUILD_NUMBER,并补充日志路径后缀。 - 拼接前缀:
awk '{print "/var/jenkins_home/jobs/"$0}'加上Jenkins日志存储的根路径前缀,得到最终完整路径。
更灵活的awk版本(无需硬编码分支名)
如果你需要适配不同分支名(不只是dev),可以用awk脚本自动识别分支位置:
final_log_path=$(echo "$build_url_val" | awk -F'/' ' BEGIN {OFS="/"} { # 从第5个字段开始遍历处理 for (i=5; i<=NF; i++) { gsub(/%20/, " ", $i) # 解码URL空格 # 替换job为jobs,仅当不是分支前的最后一个job if ($i == "job" && i != NF-2) { $i = "jobs" } else if ($i == "job" && i == NF-2) { $i = "branches" # 分支前的job替换为branches } } $(NF-1) = "builds/$BUILD_NUMBER/log" # 替换构建号部分 NF-- # 移除结尾的空字段 print "/var/jenkins_home/jobs", $0 # 拼接前缀输出 } ')
这个版本会自动识别URL中倒数第二个job(对应分支的父节点)并替换为branches,不管分支名是什么都能适配。
内容的提问来源于stack exchange,提问作者Karthik P
相关产品推荐
相关产品推荐

