Bash를 사용하여 지난 1분 동안 파일에 추가된 새 줄을 어떻게 계산할 수 있나요?
여러 파일의 마지막 1분 새 줄을 동시에 계산하고 출력을 얻으려면 가장 현명한 방법은 무엇입니까?
몇 가지를 시도했지만 좋은 해결책을 찾지 못했습니다.
Bash 대신 프로그래밍 언어를 사용해 볼 수도 있습니다.
답변1
두 번 사용 wc -l
하고 결과를 뺍니다.
before=$(wc -l < yourfile)
sleep 60
after=$(wc -l < yourfile)
let dif=after-before
echo "$dif"
마지막 $dif
몇 줄만 인쇄할 수도 있습니다.
tail -n$dif yourfile
더 많은 행을 동시에 추가할 수 있지만 여기서는 원자적인 작업이 없습니다.
wc -l
증분 변경 사항(적어도 추가된 행 수)을 추적하려면 1분마다 출력을 기록하면 됩니다. 그러나 이 기능이 필요할지 미리 알지 못하면 이 작업을 수행할 수 없습니다. 각 줄에 타임스탬프가 없으면 파일의 어느 부분이 언제 추가되었는지 알 수 없습니다.
답변2
이것이 나의 최종 해결책입니다.
#!/bin/bash
for i in *access_log; do
(
before=$(wc -l < $i)
sleep 10
after=$(wc -l < $i)
let dif=after-before
echo "$i: $dif"
) &
done
답변3
{
tail -c 1 > /dev/null
sleep 60
wc -l
} < your-file
그리고 ksh93
:
{ sleep 60; wc -l; } < your-file <#((EOF))
파일을 열고 끝(첫 번째 읽기에서 바이트 삭제)을 찾은 다음 60초 동안 대기한 다음 계산을 호출하여 wc -l
1분 전 위치와 파일 끝(새 줄 사이의 줄 바꿈 수)을 계산합니다. (더 큰 경우) .
이 60초 동안 추가된 부분만 읽습니다. 파일이 완전히 다시 작성된 경우 파일 원래 부분의 개행 수에 대한 결과 변경은 고려되지 않습니다.
또한 파일이 삭제되었거나 동일한 이름의 파일이 다시 생성되었거나 파일이 원래 열렸던 디렉터리에 링크된 경우에도 원본 파일의 변경 사항을 확인합니다.
로그 파일에 어떤 속도로 라인이 추가되는지 알고 싶다면 다음 pv -l
과 함께 사용하는 또 다른 옵션이 있습니다 tail -f
.
for f in *access_log; do
tail -fn0 -- "$f" | pv -cN "$f" -ral > /dev/null &
done
wait
-ra
현재 및 평균 이자율. -l
그래서 비율은 수량으로 표현됩니다.철사초당.