仅打印时间戳大于输入时间戳的行?

时间:2014-06-24 19:22:14

标签: bash unix command-line awk grep

我正在使用Python处理来自hadoop文件系统的输出,其中包含时间戳和文件名。

由于输出很长,我想只打印尚未检查的行。

为此,我将存储时间戳last_ts,这是系统最后一次检查。

要打印整个输出,我正在使用命令

hadoop fs -ls /path/to/donemarkerfiles/ | sort -k 6 |awk '{print $6" "$7" "$8} '

其中6是日,7是时间,8是内容。

我想将6和7与last_ts进行比较,并仅打印某些行。

我该怎么做?我试图在if中使用awk条件,但我偶然发现并放弃了。


示例输出:

2014-06-23 05:45 /user/hdfs/warehouse/donemarkers/20140621_basic.done
2014-06-23 07:13 /user/hdfs/warehouse/donemarkers/20140621_stat.done
2014-06-23 08:08 /user/hdfs/warehouse/donemarkers/20140621_raw.done
2014-06-23 09:30 /user/hdfs/warehouse/donemarkers/20140621_join.done
2014-06-23 09:31 /user/hdfs/warehouse/donemarkers/20140621_upload_file.done
2014-06-23 15:52 /user/hdfs/warehouse/donemarkers/20140622_basic.done
2014-06-23 20:23 /user/hdfs/warehouse/donemarkers/20140622_stat.done
2014-06-23 21:40 /user/hdfs/warehouse/donemarkers/20140622_raw.done
2014-06-23 22:57 /user/hdfs/warehouse/donemarkers/20140622_join.done
2014-06-23 22:58 /user/hdfs/warehouse/donemarkers/20140622_upload_file.done

1 个答案:

答案 0 :(得分:2)

这个很难理解,我想这主要是因为我不是一个awk专家。然而,这很重要:

cat /tmp/data | awk '{"date -d \"" $1 " " $2 "\" +%s"|getline secs; print secs, $0}'

使用awk调用标准date util格式化为epoch secs,并使用getline将该返回值赋给awk变量。在我的命令中,我只是将所有内容都打印出来,现在让我们进行过滤。

cat /tmp/data | awk '{"date -d \"" last_ts "\" +%s"|getline mindate; "date -d \"" $1 " " $2 "\" +%s"|getline secs; if (secs > mindate) print $0}'

现在我们在那里有两个cmd|getline var形式的东西,看起来很笨拙。我会把它放在一个脚本中(带注释),但我从不输入它' live'。另外,我不清楚last_ts的生活地点。在awk脚本中已经?