Gnu texttools를 사용하여 연속 "wc -l"을 실행하는 방법은 무엇입니까?

Gnu texttools를 사용하여 연속 "wc -l"을 실행하는 방법은 무엇입니까?

당연히 알지

cat logfile.txt | wc -l
120

파일의 줄 수를 알려줍니다.

하지만

tail -f logfile.txt

다른 프로그램에서 작성한 새 줄이 표시됩니다 logfile.txt.

표준 텍스트 유틸리티를 사용하여 연속적으로 업데이트되는 logfile.txt 줄 수를 얻을 수 있도록 두 가지를 결합할 수 있습니까?

나도 알아

watch wc -l logfile.txt

하지만 매번 전체 파일을 다시 계산하고 싶지는 않습니다. 낭비처럼 보입니다. 매초마다 추가 전용 카운트를 수행해야 하며 \r줄 끝에 a 대신 a를 사용해야 할 수도 있습니다.\n

답변1

아마도:

tail -n +1 -f file | awk '{printf "\r%lu", NR}'

각 입력 줄에 대한 숫자를 출력합니다(단, 터미널로 전송되면 이전 값을 덮어씁니다).

또는 tail -f셸에서 수동으로 수행할 수도 있습니다.

n=0
while :; do 
  n=$(($n + $(wc -l)))
  printf '\r%s' "$n"
  sleep 1
done < file

(초당 최대 하나의 wc명령을 실행하며 sleep모든 쉘에 이 기능이 내장되어 있는 것은 아닙니다. while을 사용하면 내장 ksh93명령 sleep을 얻을 수 있습니다 ( wc적어도 데비안에서는). 디렉토리가 존재하는지) 또는 사용되었는지 (묻지 마세요...))./opt/ast/bin$PATHcommand /opt/ast/bin/wc

다음과 같은 것을 사용할 수 있습니다 pv.

tail -n +1 -f file | pv -bl > /dev/null

단, 1000개를 초과하면 k, ... 접미사(및M이 문제에는 방법이 없는 것 같습니다.).

답변2

bash다음 없이 순수하게 계산해 보세요 wc.

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo $a ; done

또는 다음과 같이 이전 값을 덮어쓸 수도 있습니다.

a=0 ; tail -f file | while read -r line ; do ((a++)) ; echo -ne "\r$a" ; done

답변3

나는 그런 것이 있다고 믿지 않습니다. 하지만 다음과 같은 작업은 쉬워야 합니다.

#!/usr/bin/perl

$for_a_while = 1;

$oldcount = -1;
$count = 0;
open($fh, "<", $ARGV[0]);

for (;;) {
  for ($curpos = tell($fh); <$fh>; $curpos = tell($fh)) {
    $count++;
  }
  if($count != $oldcount) {
    print "$count\n";
    $oldcount = $count;
  }
  sleep($for_a_while);
  seek($fh, $curpos, 0);
}

(일반 아이디어는 에서 복사됨 perlfunc(1))

답변4

awk 기반 솔루션을 계속 사용하면 로그의 모든 줄에 대해 카운터를 볼 필요가 없을 것입니다. 이 경우 다음과 같이 설정할 수 있습니다(숫자는 10줄마다 변경됩니다).

tail -n +0 logfile.txt | \
    awk 'a+=1{}a%10==0{printf "\r%lu", a}END{printf "\r%lu", a}'

관련 정보