bash在awk(gnu)中用control语句动态传递月份名称

cnwbcb6i  于 2021-06-02  发布在  Hadoop
关注(0)|答案(3)|浏览(453)

嗨,我正在尝试使用下面的命令来匹配月和日(6天前,也就是6月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

请指出我在代码中遗漏了什么?

hivapdat

hivapdat1#

月份变量中有引号,因此请使用:

date --date="6 days ago" +\%b

或者,在awk中,使用以下内容来表示月份:

gensub("\"","","g",month)

我注意到在两个变量赋值(-v)之间还有一个逗号需要删除。完整的解决方案是:

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
68bkxrlz

68bkxrlz2#

我试图使用你的awk过滤器查询,但我无法使它工作。
我通过重写查询并使用 grep 使用构造的日期字符串进行筛选而不是 awk .

ls -ltr |egrep "$(date --date="6 days ago" +%b) +$(date --date="6 days ago" +%d | sed 's/^0*//')" |awk '{print $9}'|wc -l
beq87vna

beq87vna3#

我找到了另一种计算方法。

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

相关问题