如何使用awk解决日期过滤器的问题

时间:2019-01-04 09:27:34

标签: awk hdfs

我想为日期过滤一些文件(我无法使用find,因为这些文件位于HDFS中)。我发现的解决方案是使用awk。

这是我要处理的数据示例

drwxrwx--x+  - hive     hive                  0 2019-01-01 20:02 /dat1
drwxrwx--x+  - hive     hive                  0 2019-01-02 16:38 /dat2
drwxrwx--x+  - hive     hive                  0 2019-01-03 16:59 /dat3

如果我使用此命令:

$ ls -l |awk '$6 > "2019-01-02"'
drwxrwx--x+  - hive     hive                  0 2019-01-03 16:59 /dat3

我没有任何问题,但是如果我想在2天前创建一个脚本来帮助我进行过滤,请在awk中添加以下表达式:

$ date +%Y-%m-%d --date='-2 day'
2019-01-02

类似这样,但是不起作用:

ls -l |awk '$6 >" date +%Y-%m-%d --date=\'-2 day\'"'   
>

好像缺少了一些东西,但我不知道它是什么。

2 个答案:

答案 0 :(得分:0)

首先,Never try to parse the output of ls

如果您想使用目录n中最长/path/to/dir/天的文件/目录

$ find /path/to/dir -type f -mtime -2 -print
$ find /path/to/dir -type d -mtime -2 -print

第一个用于文件,第二个用于目录。

如果您仍然想用awk解析ls,则可以尝试以下操作:

$ ls -l | awk -v d=$(date -d "2 days ago" "+%F") '$6 > d'

您遇到的问题是将双引号嵌套到单引号中。

答案 1 :(得分:0)

通常不建议解析ls的输出并操纵文件的mod-time。但是,如果您坚持使用yyyymmdd格式,则以下变通办法将为您提供帮助。我将这种技巧用于日常琐事,因为它使用数字比较

$ ls -l --time-style '+%Y%m%d' delete_5lines.txt jobinfo.txt stan.in sample.dat report.txt
-rw-r--r-- 1 user1234 unixgrp    34 20181231 delete_5lines.txt
-rw-r--r-- 1 user1234 unixgrp   226 20190101 jobinfo.txt
-rw-r--r-- 1 user1234 unixgrp  7120 20190104 report.txt
-rw-r--r-- 1 user1234 unixgrp 70555 20190104 sample.dat
-rw-r--r-- 1 user1234 unixgrp    58 20190103 stan.in

在1月3日之后获取文件

$ ls -l --time-style '+%Y%m%d' delete_5lines.txt jobinfo.txt stan.in sample.dat report.txt |  awk ' $6>20190103' 
-rw-r--r-- 1 user1234 unixgrp  7120 20190104 report.txt
-rw-r--r-- 1 user1234 unixgrp 70555 20190104 sample.dat

在1月3日当天或之后获取文件。

$ ls -l --time-style '+%Y%m%d' delete_5lines.txt jobinfo.txt stan.in sample.dat report.txt |  awk ' $6>=20190103' 
-rw-r--r-- 1 user1234 unixgrp  7120 20190104 report.txt
-rw-r--r-- 1 user1234 unixgrp 70555 20190104 sample.dat
-rw-r--r-- 1 user1234 unixgrp    58 20190103 stan.in

恰好是1月3日

$ ls -l --time-style '+%Y%m%d' delete_5lines.txt jobinfo.txt stan.in sample.dat report.txt |  awk ' $6==20190103' 
-rw-r--r-- 1 user1234 unixgrp    58 20190103 stan.in

您可以给它起别名

$ alias lsdt=" ls -l --time-style '+%Y%m%d' "

并像使用它

$ lsdt jobinfo.txt stan.in sample.dat report.txt

注意:同样,如果要在脚本中使用它,则应避免使用它...只需将其用于日常琐事