Bash: 명령 시간의 "실제" 출력을 구문 분석하고, 출력 문자열을 검사하고, 타임스탬프를 추가하고 출력 파일로 보냅니다.

Bash: 명령 시간의 "실제" 출력을 구문 분석하고, 출력 문자열을 검사하고, 타임스탬프를 추가하고 출력 파일로 보냅니다.

각본가가 아닙니다. 명령을 실행하는 데 걸리는 시간을 확인하고, 성공했는지 표시하고, 타임스탬프를 추가하고, 모든 것을 로그 파일에 추가하기 위해 반복 테스트를 작성하려고 합니다.

아, 이것은 Mac의 bash에 있습니다.

"실제"를 분석하고 분석하기 위해 다음을 시도했습니다.

time ./login.sh | sed -n 's/.*real://p' >> output.txt

또는

(time ./login.sh) 1> /dev/null 2> output.txt

login.sh 스크립트는 "성공" 또는 "실패"가 추가된 상태로 실행됩니다.

application login -u "user" -p '******' "host.domain.com" | grep "Succeeded" &> /dev/null
if [ $? == 0 ]; then
    echo "  Suceeded" >> output.txt
else
    echo "  Failed" >> output.txt
fi

이 모든 것을 sleep 명령과 함께 For 루프에 넣어 5분마다 발생하도록 하겠습니다.

for n in {1..1000};
do
    # Command that Adds the time stamp
    # the command to find the real time above once I get it working
    sleep 5m
done

원하는 출력은 다음과 유사합니다.

Sun Jul 29 16:15:06 PDT 2019 real   0m0.815s  Suceeded
Sun Jul 29 16:20:06 PDT 2019 real   0m0.635s  Suceeded
Sun Jul 29 16:25:06 PDT 2019 real   0m1.053s  Suceeded
Sun Jul 29 16:30:06 PDT 2019 real   0m15.653s  Failed

답변1

/usr/bin/time쉘 내장 대신 사용하십시오 time. 그런 다음 명령을 stderr별도의 파일에 캡처하십시오. 경과된 실시간은 출력의 첫 번째 단어이므로 사용하기 쉽습니다.stdoutapplicationtimeawk

grep스위치 가 있으므로 -q로 리디렉션할 필요가 없습니다 /dev/null.

마지막으로 몇 초 안에 매개변수를 허용하므로 이것이 원하는 대로 작동하지 sleep않을 것 같습니다 . sleep 5m하지만 구문은 허용되므로 그대로 두겠습니다.

for n in {1..1000}
do

    /usr/bin/time application login -u "user" \
             -p '******' "host.domain.com" > login.out 2>time.out

    realtime=$(awk '{print $1}' time.out)

    echo -n "$(date) real $realtime " >> output.txt

    if grep -q "Succeeded" login.out; then
        echo "Succeeded" >> output.txt
    else
        echo "Failed"   >> output.txt
    fi

    sleep 5m

done

답변2

grep/awk/sed를 사용하지 말고 시간에 대한 형식 옵션을 사용하세요. 예를 들어 time -f "%e" command명령에 걸린 실제 시간(초)만 출력하고 그 이상은 출력하지 않습니다.

관련 정보