당연히 알지
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
$PATH
command /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}'