如何使用awk解析Makefile提取LTESTS中的测试文件
用awk提取Makefile中LTESTS的所有测试文件
嘿,作为awk新手想要搞定Makefile里的LTESTS提取,这事儿不难!针对你那种用反斜杠换行的LTESTS格式,我给你两个实用的awk方案,保证能把70个测试文件都揪出来~
方案1:逐行合并反斜杠结尾的内容
这个命令会先把所有属于LTESTS的行(包括反斜杠换行的后续行)合并成一行,再提取所有测试文件名:
awk '/^LTESTS=/{flag=1; sub(/^LTESTS=/, "");} flag{gsub(/\\$/, ""); printf "%s", $0; if (!/\\$/) flag=0;} END{print ""}' Makefile | xargs -n1
命令拆解:
/^LTESTS=/:匹配到以LTESTS=开头的行时,开启标记flag=1,同时用sub去掉行首的LTESTS=前缀- 当
flag生效时:gsub(/\\$/, ""):去掉行尾的反斜杠(这是Makefile里的换行延续标记)printf "%s", $0:把当前行内容拼接到输出里(不换行)if (!/\\$/) flag=0:如果当前行没有反斜杠结尾,说明LTESTS的内容已经结束,关闭标记
END{print ""}:最后补个换行,避免输出粘在一起- 管道后的
xargs -n1:把所有空格分隔的测试文件名拆成每行一个,方便查看
方案2:自定义记录分隔符简化处理
这个写法更简洁,利用awk的记录分隔符RS直接合并反斜杠换行的行:
awk 'BEGIN{RS="\\\n"; ORS=" "} /^LTESTS=/{sub(/^LTESTS=/, ""); print $0} END{print "\n"}' Makefile | xargs -n1
命令拆解:
BEGIN{RS="\\\n"; ORS=" "}:设置记录分隔符为「反斜杠+换行」,这样所有用反斜杠连接的行都会被当成一个完整记录;输出分隔符设为空格,保证合并后的内容用空格分隔/^LTESTS=/:匹配到目标行后,去掉LTESTS=前缀并打印内容END{print "\n"}:最后补换行,让输出更规整- 同样用
xargs -n1把结果拆成每行一个文件名
测试效果
用你给的示例Makefile测试,运行任意一个命令都会输出:
connect proxy-connect connect-privsep
换成你有70个测试文件的真实Makefile,也能一次性把所有文件名都提取出来~
内容的提问来源于stack exchange,提问作者kavitha R
相关产品推荐
相关产品推荐

