如何使用awk解析Makefile

时间:2018-05-22 01:05:24

标签: bash awk sed

我是awk脚本的新手。我需要帮助找出解析makefile的方法。

以下是我的示例make文件。我使用"进行测试"运行我的测试。所有测试文件列在" LTESTS ="下。在这里,我只列出了3个文件(connect,proxy-connect,connect-privsep),但实际上我有70个文件。如何获取" LTESTS ="。

中列出的所有文件

我搜索但无法找到提取的方法。谢谢你的帮助。

    REGRESS_TARGETS=    t-exec
tests:      prep $(REGRESS_TARGETS)

prep:
    test "x${USE_VALGRIND}" = "x" || mkdir -p $(OBJ)/valgrind-out

LTESTS=     connect \
        proxy-connect \
        connect-privsep



t-exec: ${LTESTS:=.sh}
    @if [ "x$?" = "x" ]; then exit 0; fi; \
    for TEST in ""$?; do \
        echo "run test $${TEST}" ... 1>&2; \
        (env SUDO="${SUDO}" TEST_ENV=${TEST_ENV} ${TEST_SHELL} ${.CURDIR}/test-exec.sh ${.OBJDIR} ${.CURDIR}/$${TEST}) || exit $$?; \
    done

2 个答案:

答案 0 :(得分:0)

您可以像这样重写字段分隔符:

awk 'BEGIN { 
    FS = "[ \t=]*(\\\\[ \t]*\r?\n[ \t]*)?"
    RS = "" 
}
$1 == "LTESTS" { 
    for(i=2;i<=NF;i++) print $i 
}
' Makefile

请注意RS = ""表示在LTESTS之前和之后需要一个空行。

输出:

connect
proxy-connect
connect-privsep

答案 1 :(得分:0)

$ awk 'sub(/.*LTESTS=/,""){f=1} !NF{f=0} f{print $1}' file
connect
proxy-connect
connect-privsep

或者如果在LTESTS块之后没有空行:

awk 'sub(/.*LTESTS=/,""){f=1} f{print $1; if (!/\\/) exit}' file