我使用下面的awk(来self 上一篇文章中的how to get list of folders that older then 30 days)来打印比XX days更早的文件夹,如下面的例子所示.对于这个例子,我们在awk语法中将30天设置为常量

    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 days,并按如下方式更改了awk,因此我们希望将day值传递给awk,作为day=100

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

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

你能指出我的错误吗?

推荐答案

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

正确的代码应该如下所示

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

确保您理解Shell变量和Awk变量之间的区别.贝壳对Awk一无所知,反之亦然.(就像您不知道运行计算机的代码中变量的名称或值一样,除非它公开一个接口让您判断其当前状态.)

Linux相关问答推荐

Azure Linux B1s VM-Jenkins Sever已安装,但主页未打开

Linux 中大型 TSV 的条件编辑

Qt会泄漏内存吗?

如何比较 2 个文件并将第二个文件的所有行打印到输出文件 awk

我想使用排序命令对第 5 列进行日期排序.但问题是格式不一致,有什么方法可以做到吗?

Dockerfile:无法复制文件

是否可以在 XTerm 或 Konsole 中使 stdout 和 stderr 输出具有不同的 colored颜色 ?

Stripping linux 共享库

Linux 应用程序分析

无法覆盖符号链接 RedHat Linux

bash shell 脚本函数定义(如f () {})中使用的括号是什么?它与使用function关键字不同吗?

Docker Volume 没有挂载任何文件

如何对 /dev/random 或 /dev/urandom 进行 base64 编码?

以原子方式移动目录

可以通过 SSH 连接的所有用户的列表

Anaconda:禁用提示更改

如何更改 tmux 会话的起始目录?

如何在 UNIX 中将字符串转换为整数

如何通过 xmllint 使用 XSD 验证 XML 文件

适用于 Windows、Linux、MacOS X 的跨平台脚​​本