user-login-checker simple(bash)脚本

时间:2011-05-11 08:21:00

标签: bash scripting

我非常擅长bash脚本编程(我在python中编程)但有时我需要在我的ubuntu上运行一些简单的脚本(在工作中)所以我开始学习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列显示他记录的总时间。数据限制在从25/4到20/5(参数)的时间

我有一些线索,但他们都是&#34;丑陋&#34;。再一次,我是一个python程序员,所以我以前常常有#34;漂亮&#34;解决方案。

我正在考虑使用last然后解析文本...

任何代码提示都会有所帮助

最好的k。

1 个答案:

答案 0 :(得分: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