쉘에서 두 가지 뺄셈을 수행하는 방법

쉘에서 두 가지 뺄셈을 수행하는 방법

쉘에서 두 줄의 시간 형식을 빼야 합니다. 시간 형식은 hh:mm:ss입니다. 다음 코드를 사용하여 시간을 가져옵니다.

cat /var/log/kern.log |grep usb |tail -2| awk '{print $3}'

위 코드의 출력은 다음과 같습니다.

18:23:24
18:20:20

초 단위로 차이점을 어떻게 찾을 수 있나요?

답변1

나는 더 나아갈 것이다 (영감:이 게시물):

# => 18:23:24 --> 66204
grep usb /var/log/kern.log|tail -2|awk '{print $3}'|awk -F: '{print ($1 * 3600) + ($2 * 60) + $3 }'

그래서 나는 다음을 수행했습니다.

66204
66020

그러면 다음과 같이 할 수 있습니다:

echo $((66204-66020)) # => 184

답변2

보다 일반적인 솔루션은 다른 날짜의 시간에도 작동하므로 다음과 같습니다.

echo "18:23:24
18:20:20" | 
  (read later_time; read former_time;
    former_seconds=$(date --date="$former_time" +%s);
    later_seconds=$(date --date="$later_time" +%s);
    echo $((later_seconds-former_seconds)) )
184

답변3

다음을 사용하면 awk한 번의 통화로 이 작업을 수행할 수 있습니다.

awk '
/usb/{
("date +%s -d "$3)|getline t[++i];
}
END{
print t[i-1]-t[i];
}' /var/log/kern.log

답변4

awk의 전체 파이프라인에는 불필요한 파이프가 많지 않습니다.
Costas와 유사하지만 외부 명령을 사용하지 않습니다.

awk '/usb/{split($3,a,":");b[++x]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[x-1]-b[x]}' /var/log/kern.log

이는 파이프라인을 유지하기로 결정한 경우 날짜 설정의 마지막 지점일 뿐입니다.

 awk '{split($1,a,":");b[x++]=(a[1]*3600)+(a[2]*60)+a[3]}END{print b[0]-b[1]}'

관련 정보