2011-05-11 26 views
1

我很新的bash脚本(我在python中编程),但有时我需要在我的ubuntu上运行一些简单的脚本(在工作中),所以我开始学习bash脚本。用户登录检查简单(bash)脚本

无论如何,我想创建一个脚本,需要2个参数(开始和结束时间),并会给出在这段时间之间登录的结果用户。这也可以说他们多少次登录,他们被记录在合并时

例如:

$./run 25/4 20/5 <br /> 
joe 4x 3 days and 11:45 <br /> 
bob 2x 0 days and 2:17 <br /> 
smith 17x 21 days and 23:17 <br /> 

所以第一列说,这是什么样的用户,第二个说他多少次登录在系统中,第3到第6个显示了他记录的组合时间。数据限于从25/4到20/5的时间(参数)

我有一些线索,但它们都是“丑陋的”。我又是一名Python程序员,所以我习惯于拥有“漂亮”的解决方案。

我想做到这一点通过last,然后只解析文本...

任何代码提示将是有益的

最佳ķ。

+1

我想不出任何理由为什么你不能做到这一点在Python作为是你最喜欢什么。只需创建一个python脚本来分析'last -F'的输出并呈现你想要实现的内容。 – hmontoliu 2011-05-11 13:26:49

+0

这样做的关键就是学习bash脚本。如果我在Python中这样做会挫败目的。 – karantan 2011-05-12 11:25:27

+0

我理解你的观点,但是要做你想做的事情,你需要像'sed','awk','grep'等不完全是bash的shell工具来解析'last'输出。因此,如果你最了解python,可以用它来解析这些东西。 Python,perl,ruby,和'sed','awk'等一样是有效的功耗shell工具。 – hmontoliu 2011-05-12 11:55:16

回答

1

下面的bash脚本将完成你想要的大部分内容,我认为它有足够的内容对你有帮助。但是,我真的不认为这种事情应该在bash中完成。就我个人而言,我更喜欢last的本地输出到您描述的输出。

下面的脚本的一个大问题是它不是很便携。它适用于我的Ubuntu 11.04工作站,但不适用于我的RHEL 4工作站(较旧的awk版本与我如何指定分隔符不兼容)。

#!/bin/bash 

for user in $(last | head -n-2 | cut -d' ' -f1 | sort | uniq); do 
    echo -n $user $(last | head -n-2 | cut -d' ' -f1 | grep "^$user$" | wc -l)x 
    hours=$(last | head -n-2 | grep "^$user\b" | awk '{ print $NF }' | grep -v '^in$' | awk -F'[\(\):]' '{ print $2 }' | paste -sd+ | bc) 
    minutes=$(last | head -n-2 | grep "^$user\b" | awk '{ print $NF }' | grep -v '^in$' | awk -F'[\(\):]' '{ print $3 }' | paste -sd+ | bc) 

    days=$((($hours + $minutes/60)/24)) 
    hours=$((($hours + $minutes/60) % 24)) 
    minutes=$(($minutes % 60)) 
    echo -n " $days days and $hours:$minutes" 

    if last | head -n-2 | grep "^$user\b" | grep -qs "still logged in"; then 
    echo -n ', still logged in' 
    fi 
    echo 
done