我是AWK的新手,我正在尝试找出如何获得第一列等于变量且日期大于另一个unix时间戳格式变量的所有结果。我使用'last'作为我的命令。示例输出为:
bob pts/2 172.6.14.37 Fri July 24 12:43 - 12:17 (9+23:34)
bob pts/2 172.6.14.37 Fri July 24 10:03 - 12:17 (5+23:34)
bob pts/2 172.6.14.37 Tue June 4 17:55 - 09:42 (8+15:46)
bob pts/2 172.6.14.37 Tue Mar 4 17:55 - 09:42 (8+15:46)
tim pts/1 172.6.14.37 Mon Mar 3 16:22 - 17:30 (1+01:08)
root pts/1 172.6.14.37 Thu Feb 27 09:38 - 09:56 (4+00:18)
所以我想要'bob'在第一列中的所有结果。我有
last -f /var/log/btmp | awk '$1 == "bob"'
这给了我所有bobs登录失败。现在我需要再次过滤日期字段大于“20140723145100
”之类的内容,如
last -f /var/log/btmp | awk '$1 == "bob" && $4 >= $DATE'
假设$ DATE = 20140723145100,我想要的结果是:
bob pts/2 172.6.14.37 Fri July 24 12:43 - 12:17 (9+23:34)
bob pts/2 172.6.14.37 Fri July 24 10:03 - 12:17 (5+23:34)
答案 0 :(得分:3)
使用-s
中的last
选项:
last -s 20140723145100
来自man last
:
-s , - 时间
显示自指定时间以来的登录状态。这很有用, 例如,轻松确定在特定时间登录的用户。该 选项通常与--until。
结合使用
然后为用户grep:
last -s 20140723145100 | grep "^bob"
作为you do not have -s
选项,您可以使用此解决方法:将所有last
输出和输出存储到特定时间(使用-t
选项)。然后比较输出:
last -f /var/log/btmp | grep "^bob" > everything
last -f /var/log/btmp -t "20140723145100" | grep "^bob" > upto_20140723145100
grep -vf upto_20140723145100 everything
答案 1 :(得分:3)
击:
user=bob
since=20140623145100
last -Fa -f /var/log/btmp |
while read line; do
set -- $line # no quotes here
[[ $1 == "$user" ]] || continue
[[ $(date -d "$3 $4 $5 $6 $7" +%Y%m%d%H%M%S) > $since ]] && echo "$line"
done
答案 2 :(得分:3)
使用GNU Awk:
gawk -v user=bob -v date=20140723145100 -F '[[:space:]]{3,}| - ' '$1 == user { cmd = "exec date -d \"" $4 "\" +%Y%m%d%H%M%S"; cmd | getline d; close(cmd); if (d >= date) print }' sample
输出:
bob pts/2 172.6.14.37 Fri July 24 12:43 - 12:17 (9+23:34)
bob pts/2 172.6.14.37 Fri July 24 10:03 - 12:17 (5+23:34)
当然实际命令是last -f /var/log/btmp | gawk -v user=bob -v date=20140723145100 ...
。
这是一个脚本版本:
#!/usr/bin/gawk -f
BEGIN {
FS = "[[:space:]]{3,}| - "
}
$1 == user {
cmd = "exec date -d \"" $4 "\" +%Y%m%d%H%M%S"
cmd | getline d
close(cmd)
if (d >= date)
print
}
用法:
last -f /var/log/btmp | gawk -v user=bob -v date=20140723145100 -f script.awk