를 할 때 tail -f error.log
3 초 동안 파일에 아무것도 적용되지 않은 후 프로그래밍 방식으로 줄 바꿈을 삽입하는 방법은 무엇입니까?
(한 줄 바꿈을 추가 한 후에는 다른 줄의 텍스트를 로그 파일에 추가 할 때까지 다른 줄 바꿈을 추가하지 않아야합니다.)
예를 들어,이 행은 error.log에 적용됩니다.
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
이것은 콘솔의 출력입니다.
foo
bar
boo
2far
2foo
2bar
2boo
2far
답변
예를 들어 다음 과 같이 손으로 직접 (여기서 전체 파일을 덤프하는 것처럼 더 tail -f
주석 처리를 제거하지 않는 한) 여기에서 구현할 수 있습니다 .seek()
tail -n +1 -f
perl
perl -e '
$| = 1;
# seek STDIN, 0, 2; # uncomment if you want to skip the text that is
# already there. Or if using the ksh93 shell, add
# a <((EOF)) after < your-file
while (1) {
if ($_ = <STDIN>) {
print; $t = 0
} else {
print "\n" if $t == 3;
# and a line of "-"s after 10 seconds:
print "-" x 72 . "\n" if $t == 10;
sleep 1;
$t++;
}
}' < your-file
또는 3 초 동안 입력이없는 경우 tail -f
테일링을하고 perl
개행을 삽입하는 데 사용 하십시오.
tail -f file | perl -pe 'BEGIN{$SIG{ALRM} = sub {print "\n"}} alarm 3'
그들은 출력 자체가 느려지지 않는다고 가정합니다 (출력이 활발하게 읽히지 않는 파이프로 갈 때).
답변
bash
+ date
솔루션 :
while IFS= read -r line; do
prev=$t # get previous timestamp value
t=$(date +%s) # get current timestamp value
[[ ! -z "$prev" ]] && [[ "$((t-prev))" -ge 3 ]] && echo ""
echo "$line" # print current line
done < <(tail -f error.log)
답변
Python
솔루션 (동적 시간 간격 인수 포함) :
tailing_by_time.py
스크립트:
import time, sys
t_gap = int(sys.argv[1]) # time gap argument
ts = 0
while True:
line = sys.stdin.readline().strip() # get/read current line from stdin
curr_ts = time.time() # get current timestamp
if ts and curr_ts - ts >= t_gap:
print("") # print empty line/newline
ts = curr_ts
if line:
print(line) # print current line if it's not empty
용법:
tail -f error.log | python tailing_by_time.py 3