【问题标题】:How to read multiple files from within awk script without passing at command line?如何在不通过命令行的情况下从 awk 脚本中读取多个文件?
【发布时间】: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


【解决方案1】:
BEGIN {
    cmd = "printf \047%s\n\047 /var/log/app*.log"
    while ( (cmd | getline line) > 0 ) {
        ARGV[ARGC++] = line
    }
    close(cmd)
}

只要您的文件名不包含换行符,就应该可以工作。

这是适合使用 getline 的极少数情况之一 - 如果您将来考虑使用它,请务必阅读 http://awk.freeshell.org/AllAboutGetline

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    • 2013-11-29
    • 1970-01-01
    • 1970-01-01
    • 2017-06-02
    • 1970-01-01
    • 2015-04-06
    相关资源
    最近更新 更多