显示从今天开始在5天前准确登录的用户列表?

时间:2013-12-10 17:15:22

标签: linux awk

last命令显示登录尝试的历史记录。如何过滤输出以显示从当前日期之前5天登录的用户?

以下是我迄今为止所做的事情:

last | grep Dec | grep -v reboot | awk '{print$5}'

从最后一个命令的输出中解析日期。

#!/bin/bash
     count=`$date "+%d"`
     count=$((count-5))
     last|grep -v reboot|grep Dec|awk '($5>=$count) {print $0}' 

为我工作:)感谢@Olivier Dulac的帮助

3 个答案:

答案 0 :(得分:1)

我无法在一行中完成,但这里有一个小的bash脚本可能会完成工作:

#! /bin/bash

# Find the date string we want
x=$(date --date="5 days ago" +"%a %b %e");

# And now chain a heap of commands together to...
#   1. Get the list of user
#   2. Ignore reboot
#   3. Filter the date lines we want
#   4. Print the user name using awk
#   5+6. Sort them and extract the unique values
last | grep -v "reboot" | grep "$x" | awk '{print $1}' | sort | uniq

答案 1 :(得分:0)

你的awk中的

(我这里没有“last”所以我不知道格式) 只需添加一个条件,只在看到你想要的东西时打印整行:

例如:如果月份是第3个字段,而日期是第4个字段,

last | grep -v reboot | awk ' ( ($3 == "Dec") && ($4 == "07") ) { print $0 ; }'

(再一次,没有“最后”的实际摘录,我不知道上述是否有效,但我希望你能得到一般的想法)

答案 2 :(得分:0)

我认为chooban的解决方案是最接近的,但它只列出了匹配的行。我找到了一个更好的解决方案,并且很可能它正确处理了2013-12-31 - 2014-01-01问题(如果用户在一年内登录的话,我没有发现输出格式的痕迹...,或者登录时间是前一年)。它是一个 - 少一个(长)衬垫:

last | awk -v l="$(last -t $(date -d '-5 day' +%Y%m%d%H%M%S)|head -n 1)" 'BEGIN {l=substr(l,1,55)} /^reboot / {next} substr($0,1,55) == l  {exit} 1

我认为没有'重启'这样的用户。它使用last -t YYYYMMDDHHMMSS在特定日期之前打印行的事实,但不幸的是,如果注销在指定的时间段内(显示“消失 - 没有注销”),它会更改格式,因此必须将其切断。

这不是最好的,因为它最后两次调用,但似乎有效。

输出:

root     pts/1        mytst.xyzzy.tv   Wed Dec 11 12:45   still logged in   
root     pts/0        mytst.xyzzy.tv   Wed Dec 11 11:25   still logged in   
root     pts/0        mytst.xyzzy.tv   Tue Dec 10 16:02 - 17:14  (01:12)    
root     pts/0        mytst.xyzzy.tv   Tue Dec 10 10:59 - 15:04  (04:05)    
root     pts/0        mytst.xyzzy.tv   Mon Dec  9 13:23 - 17:10  (03:46)    
root     pts/1        mytst.xyzzy.tv   Fri Dec  6 16:01 - 16:07  (00:06)    
root     pts/0        mytst.xyzzy.tv   Fri Dec  6 15:52 - 16:08  (00:15)

我希望这可以提供帮助!

相关问题