linux awk +导出值到awk未传递

k10s72fa  于 11个月前  发布在  Linux
关注(0)|答案(2)|浏览(112)

我使用下面的awk(来自我以前的帖子-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设置根本不受影响。
你能指出我的错误吗?

s5a0g9ez

s5a0g9ez1#

awk -v day=100

字符串
当你像上面那样使用awk命令行参数时,你是在声明一个变量day,其值为100,将在awk命令中使用。
但是,你正在做的是在命令行上(而不是在awk命令中):

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


这里days是未知的,不会被shell或awk扩展。
你所尝试的可以使用这种方式:

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

8wtpewkr

8wtpewkr2#

命令替换在Awk运行之前运行。此外,单引号防止变量被shell插值。
正确的代码如下所示:

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

字符串
确保你理解shell变量和Awk变量之间的区别。shell不知道任何关于Awk的事情,反之亦然。(就像你不知道运行计算机的代码中变量的名称或值一样,除非它公开一个接口让你检查它的当前状态。)

相关问题