gnu texttools로 지속적인 'wc -l'을 수행하는 방법은 무엇입니까?


28

물론 알아

cat logfile.txt | wc -l
120

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

이므로

tail -f logfile.txt

다른 프로그램이 쓰는 새로운 줄을 보여줄 것이다 logfile.txt.

표준 텍스트 유틸리티를 사용하여 logfile.txt의 지속적인 업데이트 행 수를 얻도록 두 가지를 결합 할 수 있습니까?

나는 알고있다

watch wc -l logfile.txt

그러나 매번 전체 파일을 다시 계산하고 싶지는 않습니다. 매 초마다 추가 된 카운트가 필요할 것이고 아마도 줄 끝에서 \r대신에 카운트가 필요할 것입니다 \n.


1
모든 것을 계산하는 것이 문제가되는 파일이 너무 큽니까? 폐기물 측면에서 : 배관 cat출력 wc도 큰 폐기물입니다 !!
Bernhard

예, 잠재적으로 매우 큽니다.
towi

답변:


36

아마도:

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명령 을 실행한다는 점에 유의하십시오 . ksh93while sleep는 내장되어 있고 wc(적어도 데비안에서는) 내장하기 위해서는 /opt/ast/bin앞에 추가해야 $PATH합니다. 해당 디렉토리가 존재하는지 여부 또는 사용 command /opt/ast/bin/wc하지 마십시오 (묻지 마십시오 ...).

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

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

하지만 추가하는 조심 k, M수는 1000 이상 (때 ... 접미사를 그 주위에 방법이있을 것 같지 않습니다 ).


귀하의 tail | awk솔루션 에 대한 방법. 당신의 선택권을 아십시오 : -n +0이 조합에서 나에게 일어나지 않았을 것이다.
towi

2
우와! pv또 다른 유용한 새 도구입니다. 무리 감사.
towi

grep을 사용하면 스트림에 필터를 추가 할 수 있습니다.tail -n +0 -f <my.log> | grep --line-buffered <mystring> | awk '{printf "\r%lu", NR}'
tombolinux

2
@tombolinux awk는의 상위 집합입니다 grep. tail -n +0 -f file | awk '/mystring/ {printf "\r%lu", ++n}'
Stéphane Chazelas

시원한. 마지막에 줄 바꿈을 인쇄 END{print ""}하기 위해 추가 합니다 awk.
pLumo

6

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

1

나는 그런 것이 있다고 생각합니다. 그러나 다음 라인을 따라 무언가를 쉽게 채울 수 있어야합니다.

#!/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))


1
당신이 할 때마다 숫자가 증가합니다 printf foo >> file. wc -l에서 반환 한 레코드가 아니라 개행 문자 ( 제안한 셸 솔루션에서 와 같이)를 계산해야합니다 <$fh>. 나는 당신이 사용 tell하거나 seek전혀 필요하다고 생각하지 않습니다 .
Stéphane Chazelas

(가) <$fh>기본적으로 라인을 읽고, 기록하지. 인용 된 Perl 맨 페이지는 아마도 비협조적인 환경을 위해이 방법을 사용하도록 지시합니다 (파일 시스템에 따라 다를 수 있습니다. NFS 또는 다른 네트워크 마운트 파일 시스템은 약간의 prodding이 필요할 수 있습니다).
vonbrand

파일 끝에 도달 <$fh>하면 줄 바꿈 문자로 끝나지 않아도 레코드를 반환합니다. 그래서 만약 것은 perl파일의 끝에 앉아, 누군가 나중에는 않습니다 printf foo >> file다음 <$fh>반환 foo의 (a하지 라인 이 개행 문자로 종료되지 이후), 그리고 $count여분의 라인이 파일에 추가되지 않은 경우에도 증가합니다.
Stéphane Chazelas

OP는 한 번에 한 줄에 작성된 로그 파일을 모니터링해야합니까?
vonbrand

아니요, 솔루션이 작동하지 않을 수 있습니다. 예를 들어, 파일에 쓰는 응용 프로그램이 해당 출력을 버퍼링하면 주어진 시간에 마지막 행이 종료되지 않을 가능성이 있으므로 두 번 계산됩니다.
Stéphane Chazelas

0

awk 기반 솔루션 계속 : 로그에서 각 줄의 카운터 틱을 볼 필요는 없습니다. 이 경우 다음과 같이 할 수 있습니다 (10 줄마다 숫자가 변경됨).

tail -n +0 logfile.txt | \
    awk 'a+=1{}a%10==0{printf "\r%lu", a}END{printf "\r%lu", a}'
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.