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
发布于 2013-12-11 05:08:54
我无法在一行中完成,但这里有一个小的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发布于 2013-12-11 01:31:54
在你的awk中(我这里没有"last“,所以我不知道格式)只需添加一个条件,当你看到你想要的东西时,只打印整行:
例如:如果月份是第3个字段,天是第4个字段,
last | grep -v reboot | awk ' ( ($3 == "Dec") && ($4 == "07") ) { print $0 ; }'(再说一次,如果没有"last“的实际摘录,我不知道上面的方法是否有效,但我希望您能大致了解)
发布于 2013-12-11 20:37:48
我认为chooban的解决方案是最接近的,但它只列出了匹配的行。我找到了一个更好的解决方案,最有可能的是它正确地处理了2013-12-31 - 2014-01-01问题(如果用户登录超过一年,或者登录时间在前一年,我没有发现输出格式的痕迹)。它是一个grep-less one (长)行:
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我假设没有像“reboot”这样的用户。它使用last -t YYYYMMDDHHMMSS打印特定日期之前的行的事实,但不幸的是,如果注销在指定的时间段内(显示"gone - no logout"),它会更改格式,因此必须将其截断。
这不是最好的,因为它调用最后两次,但它似乎工作。
输出:
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)我希望这能有所帮助!
https://stackoverflow.com/questions/20500939
复制相似问题