awk + 未传递到 awk 的导出值

awk + export value to awk not passed

提问人:King David 提问时间:10/23/2023 最后编辑:Kostas NitafKing David 更新时间:10/24/2023 访问量:79

问:

我正在使用以下内容(来自我之前的帖子 - 如何获取早于 30 天的文件夹列表),以便打印早于以下示例的文件夹。关于这个例子,我们在语法中将 30 天设置为常量awkXX daysawk

    awk -v d="$(date -d '-30 days' +'%F')" '$1 < d' file
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0046
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0049
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0051
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0063
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0064
    2023-09-14 /user/hdfs/.sparkStaging/application_1693406696051_0065
    2023-09-18 /user/hdfs/.sparkStaging/application_1693406696051_0107

现在我们想用一个变量替换常量,我们更改了 如下,所以我们想将值传递给 ,因为30 daysawkdayawkday=100

awk -v day=100 -v d="$(date -d '-day days' +'%F')" '$1 < d'  file

但是我们没有看到预期的输出,设置完全不受影响。day

你能指出我的错误吗?

Linux Bash AWK

评论


答:

4赞 anubhava 10/23/2023 #1
awk -v day=100

当您使用上述 awk 命令行参数时,您声明了一个变量,其中包含要在命令中使用的值。day100awk

但是,您正在做的是在命令行上(而不是在 awk 命令中):

-v d="$(date -d '-day days' +'%F')"

这里是未知的,不会通过 shell 或 awk 扩展。days

您正在尝试的可以使用以下方式:

day=100
awk -v d="$(date -d "-$day days" +'%F')" '$1 < d' file
4赞 tripleee 10/23/2023 #2

命令替换在 Awk 运行之前运行。此外,单引号可防止 shell 对变量进行插值。

正确的代码如下所示

day=100
awk -v d="$(date -d "-$day days" +'%F')" '$1 < d'  file

确保您了解 shell 变量和 Awk 变量之间的区别。shell 对 Awk 一无所知,反之亦然。(就像您不知道运行计算机的代码中变量的名称或值一样,除非它公开了一个接口来让您检查其当前状态。