Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 将日期中前导0的行匹配_Unix_Sed_Grep - Fatal编程技术网

Unix 将日期中前导0的行匹配

Unix 将日期中前导0的行匹配,unix,sed,grep,Unix,Sed,Grep,我正在尝试对文件中的字符串进行grep,该文件具有文件名,并尝试提取当前日期前3周的字符串,但我在月份或日期格式中遇到了前导0的问题 下面是我试图从中提取数据的文件名和格式 ABC_CTL_Xtra_05-12-2019.csv ABC_Supp_rep_Income_Xtra_05-23-2020.csv ABC_Full_Elig_Xtra_05-12-2019.csv ABC_Supp_Rels_Xtra_05-26-2012.csv ABC_Full_Elig_Xtra_06-26-20

我正在尝试对文件中的字符串进行grep,该文件具有文件名,并尝试提取当前日期前3周的字符串,但我在月份或日期格式中遇到了前导0的问题

下面是我试图从中提取数据的文件名和格式

ABC_CTL_Xtra_05-12-2019.csv
ABC_Supp_rep_Income_Xtra_05-23-2020.csv
ABC_Full_Elig_Xtra_05-12-2019.csv
ABC_Supp_Rels_Xtra_05-26-2012.csv
ABC_Full_Elig_Xtra_06-26-2012.CSV
ABC_Full_Elig_Xtra_07-12-2019.csv
ABC_Full_Elig_Xtra_07-11-2019.csv
ABC_Supp_Rels_Xtra_06-26-2012.csv
ABC_Supp_Race_Xtra_06-26-2012.csv
ABC_Full_Elig_Xtra_07-10-2019.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.sha256
ABC_CTL_Xtra_06-26-2012.csv
ABC_CTL_Xtra_07-12-2019.csv
ABC_CTL_Xtra_07-30-2019.csv
ABC_Supp_rep_Income_Xtra_07-29-2012.sha256
这基本上给了我所有的文件名。有人能帮助我如何将列表过滤到3周前的文件中。

awk to the rescue

awk -v today="$(date -d "today 0" +%s)" -F"[_.-]" '
    {ts = mktime($(NF-1) " " $(NF-2) " " $(NF-3) " 00 00 00")}
    (today - ts >= 1814400) # 1814400s = 3 weeks
' file
返回

ABC_Supp_Rels_Xtra_05-26-2012.csv
ABC_Full_Elig_Xtra_06-26-2012.CSV
ABC_Supp_Rels_Xtra_06-26-2012.csv
ABC_Supp_Race_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.sha256
ABC_CTL_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_07-29-2012.sha256
它是如何工作的

-v today=“$(date-d“today 0”+%s)”
->创建变量today=今天午夜的时间戳

-F“[.-]”
->设置三种不同的列分隔符,
-

{ts=mktime($(NF-1)“$(NF-2)“$(NF-3)”00”)}
此块在文件的每一行上执行。它使用函数并创建一个变量
ts
=行上日期的时间戳
$NF
是最后一列,
$(NF-1)
前面的一列

(今天-ts>=1814400){print}
->仅当达到条件
(今天-ts>=1814400)
时,即当行的日期大于3周时,才执行此块<代码>{print}打印行,此代码是可选的,因为它是默认代码。

这可能适用于您(GNU-sed和shell):


将日期格式化为
yyyymmss
并使用
date
将文件日期转换为从历元开始的秒数。从今天起3周后的时间中减去这些时间,如果答案是肯定的,则从输出中删除这些行。

前导0有什么问题?这很完美。您还可以让我知道如何在打印这些匹配的文件名之前附加静态文本。很抱歉,如果这很明显,但我是一个unix新手。@ravi当然,您需要在每个文件名之前的第一行或每个文件名的每行开始处使用静态文本吗?我明天还会添加一些解释,以便您能够理解并更新代码。明白了。谢谢你的详细解释。你帮我省了很多时间。
ABC_Supp_Rels_Xtra_05-26-2012.csv
ABC_Full_Elig_Xtra_06-26-2012.CSV
ABC_Supp_Rels_Xtra_06-26-2012.csv
ABC_Supp_Race_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_06-26-2012.sha256
ABC_CTL_Xtra_06-26-2012.csv
ABC_Supp_rep_Income_Xtra_07-29-2012.sha256
sed 'h;s/.*_\(..\)-\(..\)-\(....\)\..*/\3-\1-\2/;s/.*/test $(($(date -d"-3 weeks" +%s)-$(date -d"&" +%s))) -gt 0 || echo NOK/e;/NOK/d;x' file