Grep / awk greater than date

2019-08-02 17:58发布

I'm sure this is an easy one for the Gurus. I'm working on my get things done and todo system. At the moment I've simply got a markdown file which I edit in VI and set tags against my things to do.

It looks like this

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

I think sync this file across my devices and use tasker / grep on android to show me the todo based on where I am.

I've now got to the stage where I want to add things to do in the future so I was thinking of something like

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

How could I exclude that line until the date is 2014-02-01? My current command for just extract @home todos is

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

I'm convinced there's a way of doing this, but google / stackoverflow hasn't lead me the right direction yet!

Help appreciated,

Thanks

Alan

标签: awk grep cut
3条回答
2楼-- · 2019-08-02 18:08

Using 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

Also, 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
'
查看更多
唯我独甜
3楼-- · 2019-08-02 18:22

For files that use dates in a format where the chronological order is the same as the lexical order, like nginx error log you can find the lines after a certain date using 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

The error log might contain multiline errors that do not start with a date, so those are filtered out.

查看更多
该账号已被封号
4楼-- · 2019-08-02 18:30

Using 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
查看更多
登录 后发表回答