원격 서버에서 임의의 시간 내에 몇 번이나 foo bar
나타나는지 /var/log/foo.log
보려고하지만 지금까지 시도한 것은 효과가 없습니다.
나는 tailing을 시작한 지 얼마나 지 났는지 추적하는 데 사용하는 타이머 스크립트를 이미 가지고 있으며 /var/log/foo.log
, 이제 foo bar
tailed 출력에 몇 번이나 나타 났는지 알 수있는 방법을 원합니다 .
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/
참고 : 출력에주의하십시오. 이 기능을 좋아할 수도 있고 싫어할 수도 있지만 긴 줄이 걸리고 잘려서 다음 줄에서 계속되지만 동일한 줄 번호를 유지합니다. 넓은 로그 파일을 구문 분석 할 때이 기능이 매우 중요합니다! 6 과 8 행에서이 기능의 효과를 볼 수 있습니다 .
답변
줄 번호와 함께 새 줄을 로그 파일에만 그리려면 다음을 수행하십시오.
{
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