我使用下面的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
设置根本不受影响。
你能指出我的错误吗?
2条答案
按热度按时间s5a0g9ez1#
字符串
当你像上面那样使用awk命令行参数时,你是在声明一个变量
day
,其值为100
,将在awk
命令中使用。但是,你正在做的是在命令行上(而不是在awk命令中):
型
这里
days
是未知的,不会被shell或awk扩展。你所尝试的可以使用这种方式:
型
8wtpewkr2#
命令替换在Awk运行之前运行。此外,单引号防止变量被shell插值。
正确的代码如下所示:
字符串
确保你理解shell变量和Awk变量之间的区别。shell不知道任何关于Awk的事情,反之亦然。(就像你不知道运行计算机的代码中变量的名称或值一样,除非它公开一个接口让你检查它的当前状态。)