tail -f (행 번호 포함)


21

원격 서버에서 임의의 시간 내에 몇 번이나 foo bar나타나는지 /var/log/foo.log보려고하지만 지금까지 시도한 것은 효과가 없습니다.

나는 tailing을 시작한 지 얼마나 지 났는지 추적하는 데 사용하는 타이머 스크립트를 이미 가지고 있으며 /var/log/foo.log, 이제 foo bartailed 출력에 몇 번이나 나타 났는지 알 수있는 방법을 원합니다 .

Google을 검색했지만 결과의 첫 10 페이지에서 관련 항목을 찾지 못했습니다.

실망스러운 결과로 시도한 것은 다음과 같습니다.

## works on local machine, but doesn't work as expected on remote
tail -f /var/log/foo.log | grep foo\ bar | sed '='

## works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | cat -n -

##  works on local, but not remote
tail -f /var/log/foo.log | grep foo\ bar | awk -F'\n' '{printf "[%d]> ", NR; print $1}'

나는 ~처럼 행동하는 sed 스크립트를 작성하려고 시도했지만 그로 tail -f제한되지 않았습니다.

노트

원격 서버는 이전 버전의 coreutils를 실행하고 있으며 업그레이드는 옵션이지만 원하는 솔루션 이 아닙니다 .


2
어떤 방식으로 작동하지 않습니까? --line-buffered옵션을 사용해보십시오 grep. 또는tail -f ... | awk '/foo bar/{print ++n, $0}'
Stéphane Chazelas

왜 리모컨에서 작동하지 않습니까? 예 :tail -f /var/log/log.log | awk '{ printf "[%d]> %s\n", NR+1 ,$0; fflush(stdout); }'

답변:


29
tail -f | nl

나를 위해 일하고 내가 생각한 첫 번째 것입니다. 즉, 실제로 파일의 실제 줄 번호가 아닌 1에서 번호가 매겨진 줄을 원한다면입니다. grep필요한 경우 적절한 장소에 추가 하기 전 또는 후에 추가 nl하십시오. 그러나 버퍼링이 발생할 수 있습니다. 내 특별한 경우 grep에는 --line-buffered옵션이 있지만 nl출력을 버퍼링하고 끄는 옵션이 없습니다. 따라서 tail | nl | grep콤보는 실제로 멋지게 흐르지 않습니다.

그것은 말했다

tail -f | grep -n pattern

나에게도 효과가 있습니다. 번호 매기기는 전체 로그 파일의 시작이 아니라 "꼬리"의 시작부터 다시 시작됩니다.


서버에서 실행되는 grep 버전에는 -n옵션 이 없습니다 .
Alexej Magura

그러나 긴 옵션이 있습니다 --line-number: tail -f /var/log/foo.log | grep foo\ bar --line-number작동합니다!
Alexej Magura

1
흥미 롭습니다. POSIX를 확인하지는 않았지만 GNU grep 맨 페이지는 다음과 같이 말합니다. -n은 POSIX에 의해 지정됩니다 .
peterph

16

나는 이것이 더 낫다고 생각한다 ..

less -N +F <filepath>

2
왜 더 잘 생각하는지 설명해 주시겠습니까?
Navigatron

이것은 큰 편집입니다, 나는 되돌아 가고 있습니다.
Adam Eberlin

3
전체 파일을 참조하는 행 번호를 표시합니다. 꼬리 -f | nl은 꼬리의 첫 번째 출력을 참조하는 행 번호를 보여줍니다.
rafaelvalle

이것은 매우 편리하며 OP 제목을 다루지 만 질문은 아닙니다 . 그들은 파일에 X가 몇 번
나오는지

6

또한 출력을로 파이프 할 수 있습니다 less. 행 번호 기능이 -N있어서 로그를 앞뒤로 스크롤 할 수 있습니다.

$ tail -f /var/log/foo.log | less -N

  1 Jan 17 22:11:58 greeneggs fprintd[4323]: ** Message: entering main loop
  2 Jan 17 22:12:01 greeneggs su: (to root) saml on pts/5
  3 Jan 17 22:12:28 greeneggs fprintd[4323]: ** Message: No devices in use, exit
  4 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Git | personal_repo | Checking for remote changes...
  5 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git rev-parse HEAD
  6 Jan 17 22:12:56 greeneggs gnome-session[1876]: 22:12:56 | Cmd | personal_repo | git ls-remote --heads --exit-code "ssh://sam@sparkleshare.jake      
  6 8us.org/home/sam/SparkleShare/personal_repo.git" master
  7 Jan 17 22:12:58 greeneggs gnome-session[1876]: X11 forwarding request failed on channel 1
  8 Jan 17 22:12:58 greeneggs gnome-session[1876]: 22:12:58 | Git | personal_repo | No remote changes, local+remote: 532213be48cce3b93cb177d409faa      
  8 03b71d0cfa5
  9 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Pinging tcp://notifications.sparkleshare.org:443/
 10 Jan 17 22:13:35 greeneggs gnome-session[1876]: 22:13:35 | ListenerTcp | Received pong from tcp://notifications.sparkleshare.org:443/

참고 : 출력에주의하십시오. 이 기능을 좋아할 수도 있고 싫어할 수도 있지만 긴 줄이 걸리고 잘려서 다음 줄에서 계속되지만 동일한 줄 번호를 유지합니다. 넓은 로그 파일을 구문 분석 할 때이 기능이 매우 중요합니다! 68 행에서이 기능의 효과를 볼 수 있습니다 .


이것은 확실하지 않습니다. 파일 이름은 어디에 지정되어 있습니까? 출력은 파일 이름의 마지막 10 행부터 시작하여 1부터 번호가 매겨 짐에주의해야합니다 tail. 기본 동작은 입니다. 긴 줄에 대해서는 해당 동작이를 less사용하여 토글됩니다 -S.
ILMostro_7

2

줄 번호와 함께 줄을 로그 파일에만 그리려면 다음을 수행하십시오.

{
  initial_lines=$(wc -l)
  tail -n +1 -f | awk -v NR="$initial_lines" '/pattern/{print NR": "$0}'
} < file.log

(를 사용 mawk하면 입력 (!) 버퍼링 -Winteractive을 방지 하는 옵션을 추가 할 수 있습니다 ).

wc -l이미 존재 하는 행 읽고 계산합니다 (줄 바꿈 문자는 마지막 행이 아직 채워지지 않은 경우에도 여전히 작동 함을 의미합니다). 그리고 tail -f나머지는 ( wc읽기를 중지 한 곳에서 시작) 나머지 awk행 번호를 알려줍니다. 처음 보는 것.


l변수 이름으로 선택하면 $ l에 내 눈을 가늘게 뜨고 $1^^ (그러나 나는 (그리고 100 % 신뢰) 당신을 다시 읽고 진실을 보았습니다) 생각합니다. 호기심을 위해 : wc -ltail -f파일 사이의 "경주 조건"을 피하기 위해 (파일이 빠르게 커지면 일부 줄을 버릴 수 있으므로 NR이 잘못된 번호에서 시작됩니다) $l대신 줄 을 건너 뛸 수 있습니까? (및 -nposix 및 gnu 의 꼬리에 어떤 제한이 있습니까?). 임시 중간 파일이 있습니까?
Olivier Dulac

@OlivierDulac tail -n +1(시작 위치에서 무엇이든 읽음)은 경쟁 조건 문제를 해결합니다. wc -l종료 시점에 파일에 없었던 줄을 정확한 위치에서 읽 wc습니다. 따라서 NR은 wc결말과 tail시작 사이에 몇 줄이 작성되었는지에 관계없이 올바른 위치에 있습니다. tail문제가있는 파일의 끝과 관련하여 어떤 위치에서 시작 하라고 말한 경우 입니다.
Stéphane Chazelas

오, interresting : 실제로 데이터가 읽히지 않는 동안 데이터가 stdin에 축적됩니다 (헤드가 시작될 때까지 화장실 끝 사이) ... 나는 그것을 깨달아야합니다. 고마워. 이제 왜 "<file"인지 알 수 있습니다. 평소와 같이 영리한 :)
Olivier Dulac

1
@OlivierDulac, 제한 사항 ( tail -n +1여기 에는 적용되지 않음 )에 대해 일반 파일의 경우 대부분의 구현에는 하나 seek이상의 buf 값을 저장하지 않고도 n 번째 줄 바꿈을 찾을 때까지 끝에서 시작하여 다시 시작할 수 있으므로 구현이 없습니다. 메모리의 데이터. 검색 할 수없는 입력의 경우 한계에 도달 할 수 있습니다. POSIX는 구현시 최소 10 x LINE_MAX 바이트 (LINE_MAX는 2048 이상)를 저장할 수 있어야합니다. GNU 꼬리 AFAIK 메모리 이외의 제한이 없습니다
스테판 Chazelas가에게

0

처음부터 번호를 매기려면 모든 줄에 적용하려면 grep -n이 필요합니다.

 tail -f -n100000000 filename.log | grep -n '' 

마지막 10 개만 보여주고 싶다면 파일을 다시 조정할 수 있다고 생각했을 것입니다.

 tail -f -n100000000 filename.log | grep -n '' | tail -n10

첫 번째는 편리하지만 너무 많은 출력을 보여줍니다. 왜 두 번째 것이 작동하지 않는지 모르겠습니다.


테일에는 "모든 라인 표시"가 없으므로 내 100000000
Martin Cleaver

1
tail -n +1 -f처음부터 꼬리까지.
Stéphane Chazelas

1
두 번째 tail는 입력의 마지막 줄을 볼 때까지 가장 오른쪽으로 아무것도 출력 할 수 없기 때문에 작동하지 않습니다 tail -f.
Stéphane Chazelas

-1

이 명령 cat -n [filename] | tail은 당신이 찾고있는 것이라면 가장 최근의 기록을 빠르게 계산하고 표시합니다.

-f정말 시나리오에 해당하는 사운드 또는 중복되지 않습니다 - 스위치는 탈출 때까지 지속한다.

wc -l [filename] 대상의 줄 수를 얻습니다.

wc -l [filenameprefix]* 패턴과 일치하는 모든 파일의 모든 행을 계산하고 끝에 요약 총계를보고합니다.

더 자세한 내용은 더 완벽한 답변을 얻을 수 있습니다.


-1

그것은 논쟁 n또는 --lines(약간 다른 방식으로 사용, 아래 참조) :

$ tail -f -n 25 /path/to/file.txt

$ tail -f --lines=25 /path/to/file.txt

도움말도 참조하십시오.

$ tail --help

1
OP는 여러 줄이 아니라 줄 번호를 원합니다.
robbat2
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.