stdin의 각 줄 앞에 정보를 생성하는 데 걸린 시간을 추가하는 스크립트를 갖고 싶습니다. 기본적으로 입력 :
foo
bar
baz
나는 갖고 싶다
0 foo
10 bar
5 baz
10은 foo 인쇄와 인쇄 막대 사이에 10 초가 경과 한 경우 5와 유사하게 인쇄 막대 후 baz를 인쇄하는 데 5 초가 걸렸습니다.
ts
타임 스탬프를 보여주는 유틸리티가 있고 https://github.com/paypal/gnomon 에 대해 알고 있지만 자바 스크립트를 사용하지 않는 것을 선호합니다.
이를위한 표준 도구가 있습니까, 아니면 awk를 사용하고 처리해야합니까?
출력을 생성하는 스크립트가라고 가정 해 보겠습니다 generate
. 그런 다음 각 행을 생성하는 데 걸리는 시간 (초)을 표시하려면 다음을 수행하십시오.
$ generate | ( t0=$(date +%s); while read -r line; do t1=$(date +%s); echo " $((t1-t0)) $line"; t0=$t1; done )
2 foo
0 foo
5 foo
3 foo
여러 줄에 걸쳐있는 동일한 명령은 다음과 같습니다.
generate | ( t0=$(date +%s)
while read -r line
do
t1=$(date +%s)
echo " $((t1-t0)) $line"
t0=$t1
done
)
또는 편의를 위해 다음 코드를 포함하는 쉘 함수를 정의 할 수 있습니다.
timer() { t0=$(date +%s); while read -r line; do t1=$(date +%s); echo " $((t1-t0)) $line"; t0=$t1; done; }
이 기능을 다음과 같이 사용할 수 있습니다.
$ generate | timer
0 foo
2 foo
4 foo
3 foo
t0=$(date +%s)
이것은 스크립트 시작 시점의 현재 시간을 에포크 이후 초 단위로 캡처합니다.
while read -r line; do
이것은 표준 입력에서 읽는 루프를 시작합니다.
t1=$(date +%s)
이것은 현재 라인이 캡처 된 Epoch 이후의 시간을 초 단위로 캡처합니다.
echo " $((t1-t0)) $line"
이것은 현재 줄에 걸린 시간을 초 단위로 인쇄합니다.
t0=$t1
이것은 t0
다음 줄에 대해 업데이트 됩니다.
done
이것은 while
루프 의 끝을 알립니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다