我想按名称中嵌入的日期对 s3 存储中的目录进行排序。
当我跑步时
s3cmd ls s3://xyz/private/backups/mails/daily/ | awk '{print $2}'
它列出了类似的目录
s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/
s3://xyz/private/backups/mails/daily/04_Apr_2020/
s3://xyz/private/backups/mails/daily/05_Apr_2020/
s3://xyz/private/backups/mails/daily/06_Apr_2020/
s3://xyz/private/backups/mails/daily/07_Apr_2020/
s3://xyz/private/backups/mails/daily/08_Apr_2020/
s3://xyz/private/backups/mails/daily/09_Apr_2020/
s3://xyz/private/backups/mails/daily/10_Apr_2020/
s3://xyz/private/backups/mails/daily/11_Apr_2020/
s3://xyz/private/backups/mails/daily/12_Apr_2020/
s3://xyz/private/backups/mails/daily/13_Apr_2020/
s3://xyz/private/backups/mails/daily/14_Apr_2020/
s3://xyz/private/backups/mails/daily/15_Apr_2020/
s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/
我希望这些按日期顺序显示,以便它看起来像这样
s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/
s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/
....
....
我尝试用列排序-M(月份)标志,但它不起作用。
我的目标是删除早于n天,但自从s3cmdls 不返回目录的创建/修改日期,我必须以困难的方式做到这一点。
我怎样才能做到这一点?
答案1
... |
awk -F'[/_]' '{printf "%04d%02d%02d %s\n", $(NF-1), index(" JanFebMarAprMayJunJulAugSepOctNovDec",$(NF-2))/3, $(NF-3), $0}' |
sort |
sed 's/[0-9]* //'
请注意,有2中的空格" Jan..."
;这不是一个 bug:awk 中的索引从 1 开始,而不是像其他语言那样从 0 开始。
答案2
一个 GNUawk
替代方案,使用date
awk -F'[/_]' '{
D=$(NF-3)"-"$(NF-2)"-"$(NF-1);
"date +%Y-%m-%d -d "D|getline nd;
print nd, $0
}' file1 | sort | cut -d" " -f 2
演练
$0
将您的字段拆分为/
或_
awk -F'[/_]' '{
将它们重新组合为有效日期
D=$(NF-3)"-"$(NF-2)"-"$(NF-1);
使用 shelldate
函数将月份从文本转换为数字,并通过将awk
's传递getline
到新变量来获取它
"date +%Y-%m-%d -d "D|getline nd;
这里没什么新东西
print nd, $0
}' file1 | sort | cut -d" " -f 2
输出
s3://xyz/private/backups/mails/daily/30_Mar_2020/
s3://xyz/private/backups/mails/daily/31_Mar_2020/
s3://xyz/private/backups/mails/daily/01_Apr_2020/
s3://xyz/private/backups/mails/daily/02_Apr_2020/
s3://xyz/private/backups/mails/daily/03_Apr_2020/
选择稍微精简使用gensub
awk -F'/' '{
"date +%Y%m%d -d "gensub("_","-","g",$(NF-1))|getline nd;
print nd, $0
}' file1 | sort | cut -d" " -f2