2011-05-11 2 views
1

나는 bash 스크립팅 (파이썬에서 프로그램)에 익숙하지만 가끔 우분투 (직장에서)에서 간단한 스크립트를 실행할 필요가있어서 bash 스크립팅을 배우기 시작했다.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 (인수)로 제한됩니다.

저는 단서가 있지만 모두 "못 생겼습니다". 다시 저는 파이썬 프로그래머입니다. 그래서 "꽤"해결책을 가졌습니다.

내가 last를 사용하여이 작업을 수행하기 위해 생각하고 그냥 텍스트를 구문 분석되었다 ...

모든 코드 힌트가 도움이

최고의 K 것이다.

+1

난 당신이 파이썬에서 그것을 할 수없는 이유에 대한 이유를 생각할 수 없다. 'last -F'의 결과를 파싱하고 달성하고자하는 것을 표현하는 파이썬 스크립트를 만드십시오. – hmontoliu

+0

이 작업을 수행 할 때 요점은 bash 스크립트를 배우는 것입니다. 내가 파이썬에서 목적을 이길 수 있다면. – karantan

+0

필자의 요점을 이해하고 싶지만, 'sed','awk', grep'과 같은 셸 도구가 필요합니다.이 도구는 엄격히 bash가 아니며'마지막 '출력을 구문 분석합니다. 따라서 파이썬을 가장 잘 알고 있다면, 그것을 사용하여 내용을 파싱하십시오. Python, perl, ruby는'sed','awk' 등 유효한 power 쉘 도구입니다. – hmontoliu

답변

1

아래의 bash 스크립트는 여러분이 원하는 대부분을 할 것이며 여러분에게 도움이되는 내용이 충분하다고 생각합니다. 그러나, 나는 이런 종류의 일이 bash에서 이루어져야한다고 정말로 생각하지 않는다. 개인적으로는 필자가 설명한 출력에 기본 출력 인 last을 선호합니다.

아래 스크립트의 큰 문제점 중 하나는 매우 이식성이 없다는 것입니다. 내 우분투 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