使用控制语句在 AWK (GNU) 中动态传递月份名称

使用控制语句在 AWK (GNU) 中动态传递月份名称

您好,我正在尝试使用下面的命令来匹配月份和日期(6 天前,即 Jun 29),以使用 AWK 搜索目录,但结果始终为“0”,而不是应该在 1800 左右。

ls -ltr /test/output|awk  -v month="$(date --date="6 days ago" +"\"%b\"")", -v day="$(date --date="6 days ago" +%d)"  '$6 ==month && $7==day {print $9}'|wc -l

也尝试过这个

ls -ltr /test/output|awk  -v month="$(date --date="6 days ago" +%b)", -v day="$(date --date="6 days ago" +%d)"  '$6 ==month && $7==day {print $9}'|wc -l

但如果我对月份进行硬编码,它就会起作用

ls -ltr /test/output|awk  -v month="$(date --date="6 days ago" +"\"%b\"")", -v day="$(date --date="6 days ago" +%d)"  '$6 =="Jun" && $7==day {print $9}'|wc -l

请建议我在代码中缺少什么?

答案1

一般来说,解析 的输出ls不是一个好主意。此外,您似乎只对文件的数量感兴趣,这使得您的方法不必要地复杂。我会建议一些类似的事情:

find -maxdepth 1 -printf "%TY-%Tm-%Td\n" | grep -c $(date -d "6 days ago" +'%Y-%m-%d')

答案2

我发现了我的错误。我找到了另一种让它发挥作用的方法。

实际方法,更正版本:

ls -ltr /test/output|awk  -v month="$(date --date="6 days ago" +\%b)" -v day="$(date --date="6 days ago" +%d)" '$6 ==month && $7==day {print $9}'|wc -l

这里对于月份我们需要使用'\'。

其他方法

yesterday_date=`date --date="6 days ago" +'%Y%m%d'`
start_date=${yesterday_date}"0000"
end_date=${yesterday_date}"2359"
temp_start_date_file=$HOME/tmpstartfile
temp_end_date_file=$HOME/tmpendfile
touch -t $start_date ${temp_start_date_file}
touch -t $end_date ${temp_end_date_file}

cd /test/output
find . -type f -newer ${temp_start_date_file} ! -newer ${temp_end_date_file} -ls | wc -l

相关内容