问题
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
回答1:
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
回答2:
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:
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.
来源:https://stackoverflow.com/questions/21174520/grep-awk-greater-than-date