Grep / awk大于日期

时间:2014-01-16 22:47:51

标签: awk grep cut

我确信这对大师来说很容易。我正在努力完成我的工作和todo系统。 目前我只是得到了一个markdown文件,我在VI中编辑并根据我要做的事情设置标签。

看起来像这样

# My project | @home
- Do this this | @home

我想在我的设备上同步这个文件,并在android上使用tasker / grep根据我的位置向我展示todo。

我现在已经到了我想要添加要做的事情的舞台,所以我想的是像

- Do this thing in the future | @home @2014-02-01

如何在日期为2014-02-01之前排除该行? 我目前只提取@home todos的命令是

grep -e "@home" myfile | cut -d '|' -f1

我确信有一种方法可以做到这一点,但谷歌/ stackoverflow还没有引导我正确的方向!

帮助表示赞赏,

由于

艾伦

3 个答案:

答案 0 :(得分:3)

使用Perl

perl -MTime::Piece -ne '
  BEGIN {$now = localtime}
  print unless /@(\d{4}-\d\d-\d\d)/ and $now < Time::Piece->strptime($1, "%Y-%m-%d")
' <<END
# My project | @home
- Do this this | @home
- Do this thing in the future | @home @2014-02-01
END
# My project | @home
- Do this this | @home

另外,GNU awk

gawk '
    BEGIN {now = systime()}
    match($0,/@([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])/, m) {
        time = mktime(m[1] " " m[2] " " m[3] " 0 0 0")
        if (time > now) next
    }
    1
'

答案 1 :(得分:1)

使用awk:

DAT=$(date +%Y%m%d)    # get today's date, for example 20140117
awk 'NF>3{gsub(/-/,"",$NF);if ($NF>d) next}{print $1}' FS="[|@]" d=$DAT file

# My project
- Do this this

答案 2 :(得分:1)

对于使用日期顺序与词法顺序相同的格式的日期的文件,如nginx error log,您可以使用awk在特定日期之后找到这些行:

    awk -v "oneHourAgo=$(date +'%Y/%m/%d %H:%M:%S' -d '1 hour ago')" '/^[0-9]{4}\/[0-9]{2}\/[0-9]{2}/{ if ($0 >= oneHourAgo) print $0 }' /var/log/nginx/error.log

错误日志可能包含不以日期开头的多行错误,因此会过滤掉这些错误。