【发布时间】:2020-06-12 18:59:28
【问题描述】:
我有一个类似这样的 awk 脚本:
awk -f d.awk /var/log/app*.log
这很好用。日志文件路径是恒定的并且不会改变(由于日志轮换,只有这个位置的文件数量会改变)所以我想从命令行和 awk 脚本中的硬代码中删除它。 有没有办法跳过从命令行传递这个参数并在 awk 脚本中对其进行硬编码,并且仍然获得相同的结果?
我阅读了有关 getline 的信息,但它对我不起作用。 awk 脚本大纲是这样的:
BEGIN{
#Initialization of few variable
}
match() {
#Main process logic
# Collect the output
output=output" " result_after_processing
}
END{
#Write the output to output file
print output >> some_output_file
}
【问题讨论】:
-
为什么?在我看来,你想朝另一个方向努力。编写一个嵌入 awk 并使用
/var/log/app*.log作为参数的 shell 脚本,而不是awk -f。 -
@WilliamPursell 感谢您的回复。我想到了这一点,但我需要从现有的 C 代码中调用这个 awk,并且不想(或允许)在两者之间添加另一层。问题是现有的 C 代码在解析通配符 (*) 并产生一些奇怪的结果方面非常糟糕。我无权访问现有的 C 代码。因此想摆脱这个论点。
-
日志文件路径由 shell 处理以提供
awk工作的文件名列表,您无法使用awk控制它 -
您可以使用
getline < "filename"读取文件一个文件,但它不会扩展通配符,而且我认为一般没有办法将awk 的输入重新分配给另一个文件。 -
@Inian,是的,你可以,但它很丑 - 你可以根据自己对文件的目录扫描来填充 awk 的
ARGC/ARGV。
标签: awk