I have a log file that contain logs as follows
1486307866.155 240207 68.146.231.80 TCP_MISS/200 790 CONNECT clients1.google.com:443 - DIRECT/172.217.6.238 -
1486307866.155
is the time in unix format with corresponds to 2017-02-05 07:17:46
(Format : Y-m-d H:i:s)
I need a unix command that give me the logs within last 30 minutes in the following format and discarding any details that i don’t need.
2017-02-05 07:17:46|68.146.231.80|clients1.google.com:443
Advertisement
Answer
Using GNU date and GNU awk you can achieve what you want:
awk -v bt=$(date "+%s" -d "30 minutes ago") '$1 > bt {printf("%s|%s|%sn", strftime("%F %T",$1), $3, $7)} ' yourfile
Explanation:
- the date command
date "+%s" -d "30 minutes ago"
gets the timestamp from 30 minutes ago - the date command is replaced with its output via the command substitution feature
$( ... )
- the awk option
-v
passes that timestamp as variable namedbt
into the awk script - the script prints only those lines from the file having a value in column one (
$1
) larger thanbt
in your desired format