tail -f (행 번호 포함) 실망스러운 결과로

원격 서버에서 임의의 시간 내에 몇 번이나 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를 실행하고 있으며 업그레이드는 옵션이지만 원하는 솔루션 이 아닙니다 .



답변

tail -f | nl

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

그것은 말했다

tail -f | grep -n pattern

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


답변

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

less -N +F <filepath>


답변

또한 출력을로 파이프 할 수 있습니다 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 행에서이 기능의 효과를 볼 수 있습니다 .


답변

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

{
  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행 번호를 알려줍니다. 처음 보는 것.


답변

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

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

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

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

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


답변

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

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

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

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

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


답변

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

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

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

도움말도 참조하십시오.

$ tail --help