2011-05-11 7 views
1

私は非常にbashスクリプティング(私はPythonでプログラム)に新しくなっていますが、時には自分のubuntu(仕事中)で簡単なスクリプトを実行する必要があります。user-login-checker simple(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を使用して行い、その後、単にテキストを解析するために考えていた

...

任意のコードヒントは

最高のk役立つだろう。

+1

私はあなたが一番好きなものであるとして、あなたはPythonでそれを行うことができない理由について何らかの理由を考えることはできません。 'last -F'の出力を解析し、達成したいものをレンダリングするpythonスクリプトを作成するだけです。 – hmontoliu

+0

これを行う上でのポイントは、bashスクリプトを学ぶことです。私がPythonでこれを行うと、その目的を破るでしょう。 – karantan

+0

私はあなたのことを理解していますが、 'sed'、' awk'、 'grep'など厳密にbashではないシェルツールが必要になりますが、' last'出力を解析する必要があります。したがって、あなたがPythonを最もよく知っている場合は、それを使って要素を解析します。 Python、perl、rubyは 'sed'、' awk'などの有効なパワーシェルツールです。 – hmontoliu

答えて

1

下記のbashスクリプトは、あなたが望むもののほとんどを行います。あなたに役立つ十分なコンテンツがあると思います。しかし、私は本当にこの種のことをbashで行うべきではないと思います。個人的には、あなたが説明した出力にネイティブ出力lastが好きです。

以下のスクリプトの大きな問題の1つは、移植性があまり高くありません。これは私の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