AWK - 首先获得所有列= $ var&&日期> = $ date

时间:2014-07-23 14:14:18

标签: bash date awk

我是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)

3 个答案:

答案 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