목록으로 'watch'명령 출력


27

로그 파일에 추가 된 분당 줄 수를 간단히 계산하고 싶습니다.

또한 매 초마다 카운트를 저장하고 싶습니다.

내가 필요한 것은 매초마다 업데이트 될 목록으로 다음 명령의 출력입니다.

watch -n1 'wc -l my.log'

'watch'명령의 'update'를 목록으로 출력하는 방법은 무엇입니까?

답변:


24

헤더를 인쇄하지 않는 -t스위치를 사용할 수 있습니다 watch. 그러나 여전히 화면을 지우므로 간단한 쉘 루프를 사용하는 것이 좋습니다.

while sleep 1; do
    wc -l my.log
done

장점 중 하나는 다른 명령 (예 :)을 쉽게 추가 date하거나 출력을 파이프하여 sed다시 포맷 할 수 있다는 것입니다. 당신이 교체되면 그건 그렇고, sleep 1함께 wc루프에서 자동으로 오류에 종료됩니다.


그러나 매 초마다 정확히 수행하지는 않습니다 (zsh 또는 ksh93의 경우 루프에서 명령을 실행하여 발생하는 드리프트를 설명하기 위해 수면 시간을 조정할 수 있음)
Stéphane Chazelas

2
@StephaneChazelas은 어느 쪽도 그와 것 wait- 단지 시도하지 watch -n 1 "sleep 5".
peterph

실제로 (procps 및 busybox 구현을 모두 확인했습니다). 이것이 유일하게 watch유용 하다고 생각 했지만 솔루션이 시계 기반 솔루션만큼 좋지는 않지만 "로그 파일이 커지는 속도" 질문에 대한 대답은 정확하지 않습니다.
Stéphane Chazelas

글쎄, 분당 라인 이 궁극적 목표라면 10 초마다 한 번 샘플링하면 충분하지 않습니다. 파일이 실제로 커지지 않는 한 오버 헤드는 끔찍하지 않습니다. 실제로 루프 내에서 타이밍 정보를 인쇄 할 수 있으며 (필요한 경우 명령이 완료되기 전과 후에도) 더 큰 파일의 경우에도 정확도가 향상 될 수 있습니다.
peterph

1
@peterph watch-p가능한 경우 올바르게 수행 할 수 있는 옵션을 가지고 있습니다 (여러 개가 동시에 허용되지 않으면 1 초마다 5 초가 걸리는 명령을 수행 할 수 없습니다). 알아요, 나는 그것을 썼습니다
:-P

8

오래된 질문이지만 방금 매우 쉬운 대답을 찾았습니다.

watch -n1 'wc -l my.log | tee -a statistics.log'

그러면 wc매 초마다 실행 되고 결과가 statistics.log 파일에 추가되고 화면에도 표시됩니다.
따라서 일련의 줄 수를 나타내는 숫자로 채워진 파일로 끝납니다 my.log.


이 명령은 watch "($MYCMD | tee -a $MYLOG)"아닙니다 watch "($MYCMD)" | tee -a $MYLOG. 내가 한 것처럼 잘못하면 출력이 매우 혼란 스러울 것입니다. 여기서 명심해야 할 또 다른 사항은이 명령이 기본적으로 각 명령 실행의 타임 스탬프를 추가하지 않으므로 루프에 대한 응답이 여전히 더 효과적 일 수 있다는 것입니다.
ffledgling


3

다음을 시도하십시오 :

watch -n1 'wc -l my.log >> statistics.log'

1

에서 더 나은 / 로그 된 출력을 얻으려고 할 때이 질문을 보았습니다 du -sh $data_path. 여기서 찾은 "while command, do sleep"패턴을 사용했지만 복잡한 AWK를 사용하여 원하는 출력을 제공했습니다.

while du -sh $data_path; do sleep 1; done | awk '
$1 != size {
    size=$1;
    path=$2;
    time=systime();
    seconds=time-prevtime;
    if(seconds < 1000000000){
        seconds=seconds" seconds"
    }else{
        seconds=""
    }
    print size, path, strftime("%m/%d/%Y@%H:%M:%S", time), seconds; 
    prevtime=time
}'

나는 실제로 이것을 하나의 라이너로 했으므로 세미콜론이 있습니다. 그러나 그것을 읽을 수있게하기 위해 나는 그것을 깨뜨 렸습니다. 결과는 다음과 같습니다.

502G /var/lib/cassandra/dump/ 05/22/2018@04:46:17
503G /var/lib/cassandra/dump/ 05/22/2018@04:46:59 42 seconds
504G /var/lib/cassandra/dump/ 05/22/2018@04:47:57 58 seconds
505G /var/lib/cassandra/dump/ 05/22/2018@04:48:55 58 seconds
506G /var/lib/cassandra/dump/ 05/22/2018@04:49:53 58 seconds
507G /var/lib/cassandra/dump/ 05/22/2018@04:50:50 57 seconds
508G /var/lib/cassandra/dump/ 05/22/2018@04:51:46 56 seconds
509G /var/lib/cassandra/dump/ 05/22/2018@04:52:44 58 seconds
510G /var/lib/cassandra/dump/ 05/22/2018@04:53:41 57 seconds

0

이를 위해 스크립트를 작성할 수 있습니다. 내가 전화 했어keep ( 계속하고있는 것처럼)bin 길에 섰다.

이것은 내 스크립트입니다 :

#!/bin/bash
echo "Repeating command $* every second"
while sleep 1; do
    "$@"
done

1
"$@"unquoted 대신 명령 (인수)을 실행하는 데 사용해야 합니다 $*. 이 방법으로 쉘은 사용자가 예상 한대로 인용 된 인수 등을 유지하게합니다. FTFY.
roaima
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.