2011-05-11 4 views
1

Я очень новичок в создании сценариев bash (я программирую на python), но иногда мне нужно запустить простой скрипт на моем ubuntu (на работе), поэтому я начал изучать скрипты bash.user-login-checker simple (bash) script

В любом случае, я хотел бы создать сценарий, который будет принимать 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

+0

Весь смысл в этом - изучить скрипт bash. если я сделаю это в python, который победит цель. – karantan

+0

Я понимаю вашу точку зрения, однако, чтобы делать то, что вы хотите сделать, вам понадобятся инструменты оболочки, такие как 'sed',' awk', 'grep' и т. Д., Которые не являются строго bash, для синтаксического анализа' last'. Следовательно, если вы знаете лучший python, используйте его для разбора материала. Python, perl, ruby, являются действительными инструментами командной оболочки, такими как 'sed',' awk' и др. – hmontoliu

ответ

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