Linux下从文件提取jobID和workflowID并转为Bash变量的方法
提取日志中的jobID和workflowID到Bash变量
现有Linux日志文件内容如下:
20230512 12:42:06 INFO: job ID 20230512 12:42:06 INFO: workflowID 20230512 12:42:06 INFO: {'jobsData': [{'jobID': '123_abc', 'jobStatus': 'RUNNING'}], 'timeoutData': {}, 'workflowID': 'bbc_999', 'workflowState': 'RUNNING'} XXXX YYY ZZZ已通过
grep 'jobID' file_name定位到目标行,输出为:20230512 12:42:06 INFO: {'jobsData': [{'jobID': '123_abc', 'jobStatus': 'RUNNING'}], 'timeoutData': {}, 'workflowID': 'bbc_999', 'workflowState': 'RUNNING'}需要将该行中的
jobID和workflowID的值提取出来,分别赋值给Bash变量jobID='123_abc'和workflowID='bbc_999'。
方法1:grep + sed组合提取
直接对grep输出做正则匹配提取:
# 提取jobID的值 jobID=$(grep 'jobID' file_name | sed -E "s/.*jobID': '([^']+)'.*/\1/") # 提取workflowID的值 workflowID=$(grep 'jobID' file_name | sed -E "s/.*workflowID': '([^']+)'.*/\1/")
核心逻辑:用sed -E开启扩展正则,[^']+精准匹配单引号之间的内容,通过捕获组\1提取目标值。
方法2:awk一次性提取两个变量
利用awk的字段分隔功能,一次处理行并生成赋值命令,再通过eval执行:
eval $(grep 'jobID' file_name | awk -F"'" '{print "jobID=\"" $4 "\"; workflowID=\"" $10 "\""}')
核心逻辑:以单引号为分隔符,目标值分别落在第4和第10个字段里,生成的赋值语句直接通过eval生效。
方法3:Python解析类JSON结构(更可靠)
日志里的内容是单引号包裹的类JSON格式,转成标准双引号JSON后,用Python解析更稳妥,适合结构复杂的场景:
eval $(grep 'jobID' file_name | python3 -c " import sys, json # 截取INFO:后的内容,把单引号转双引号变成标准JSON raw_data = sys.stdin.read().split('INFO: ')[1].replace(\"'\", '\"') data = json.loads(raw_data) # 输出赋值语句 print(f'jobID=\"{data[\"jobsData\"][0][\"jobID\"]}\"; workflowID=\"{data[\"workflowID\"]}\"') ")
核心逻辑:用JSON解析器精准提取嵌套结构里的值,避免正则匹配可能出现的边界问题。
内容的提问来源于stack exchange,提问作者nmr
相关产品推荐
相关产品推荐

