如何合并多段带不同选项的awk命令,提取指定字段生成CSV
合并awk命令实现多字段提取并输出CSV表格
需求说明
需要从指定格式的输入文本中提取以下内容,并输出带表头的CSV文件:
- SPK:路径中第6个
/分隔的字段 - REPO:路径中第8个
/分隔的字段 - log4j-version:输入行中
x.x.x格式的版本号 - Timestamp:输入行中
[]包裹的时间戳
输入文本示例:
/hosting/cbj/shared/master/jobs/TAIS/jobs/tais_aem_build/branches/feature-Dev/builds/214/log:[2022-06-23T07:23:56.117Z] ch.qos.logback.classic.log4j 0 1.2.3 com.baml.tais.tais_aem_build:jar:6.4.0
合并后的awk命令(输出CSV文件)
awk ' BEGIN { print "SPK,REPO,log4j-version,Timestamp" FS = " " } { # 拆分路径字段提取SPK和REPO split($1, path_arr, "/") spk_val = path_arr[7] repo_val = path_arr[9] # 提取[]中的时间戳 match($1, /\[(.*)\]/, ts_arr) ts_val = ts_arr[1] # 遍历字段匹配版本号 for (i=1; i<=NF; i++) { if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) { ver_val = $i break } } # 输出CSV行 print spk_val "," repo_val "," ver_val "," ts_val }' input.txt > output.csv
命令解释
- BEGIN块:输出CSV表头,设置字段分隔符为空格。
- split($1, path_arr, "/"):将第一个路径字段按
/拆分,取数组第7、9个元素作为SPK和REPO。 - match($1, /[(.*)]/, ts_arr):用正则匹配路径中
[]包裹的时间戳,存入数组后提取有效值。 - 循环遍历字段:逐个检查所有字段,匹配
x.x.x格式的版本号,找到后立即停止遍历。 - 输出行:将四个提取字段用逗号分隔,重定向到目标CSV文件。
输出示例(output.csv内容)
SPK,REPO,log4j-version,Timestamp TAIS,tais_aem_build,1.2.3,2022-06-23T07:23:56.117Z
若需输出Markdown表格格式
修改命令如下:
awk ' BEGIN { print "| SPK | REPO | log4j-version | Timestamp |" print "|-----|------|---------------|-----------|" FS = " " } { split($1, path_arr, "/") spk_val = path_arr[7] repo_val = path_arr[9] match($1, /\[(.*)\]/, ts_arr) ts_val = ts_arr[1] for (i=1; i<=NF; i++) { if ($i ~ /^[0-9]+\.[0-9]+\.[0-9]+$/) { ver_val = $i break } } print "| " spk_val " | " repo_val " | " ver_val " | " ts_val " |" }' input.txt
对应的Markdown表格输出:
| SPK | REPO | log4j-version | Timestamp |
|---|---|---|---|
| TAIS | tais_aem_build | 1.2.3 | 2022-06-23T07:23:56.117Z |
内容的提问来源于stack exchange,提问作者shravani
相关产品推荐
相关产品推荐

