【发布时间】:2014-11-22 06:42:54
【问题描述】:
我正在编写一个报告工具,它处理某个应用程序的源文件并生成一个包含两列的报告表,一列包含文件名,另一列包含单词TODO,如果文件包含对某些的调用弃用函数 deprecated_function 和 DONE 否则。
我使用awk 准备这份报告,我的 shell 脚本看起来像
report()
{
find . -type f -name '*.c' \
| xargs -n 1 awk -v deprecated="$1" '
BEGIN { status = "DONE" }
$0 ~ deprecated{ status = "TODO" }
END {
printf("%s|%s\n", FILENAME, status)
}'
}
report "deprecated_function"
这个脚本的输出看起来像
./plop-plop.c|DONE
./fizz-boum.c|TODO
这很好用,但我想重写 awk 脚本,使其支持多个输入文件,而不仅仅是一个 - 这样我就可以删除 xargs 的 -n 1 参数。我能想到的唯一解决方案涉及大量记账,因为我们需要跟踪 FILENAME 和 END 事件的更改以捕获每个文件结束事件。
awk -v deprecated="$1" '
BEGIN { status = "DONE" }
oldfilename && (oldfilename != FILENAME) {
printf("%s|%s\n", oldfilename, status);
status = DONE;
oldfilename = FILENAME;
}
$0 ~ deprecated{ status = "TODO" }
END {
printf("%s|%s\n", FILENAME, status)
}'
也许有一种更简洁、更短的方法来处理这个问题。
我正在使用 FreeBSD 的 awk,正在寻找与此工具兼容的解决方案。
【问题讨论】: