grep and tail -f?


28

tail -f파일에서 (또는 유사한) 작업을 수행 할 수 grep있습니까? 나는 그런 종류의 행동을 찾는 다른 명령을 신경 쓰지 않을 것입니다.

답변:


46

GNU tail와 GNU를 사용하여 간단한 구문을 사용하여 grepgrep 할 수 tail -f있습니다.

tail -f /var/log/file.log | grep search_term

이것은 GNU 구현뿐만 아니라이 두 유틸리티의 다른 구현과 함께 작동하는 솔루션입니다.
Kusalananda

7

잘 작동합니다. 더 일반적으로 grep프로그램이 출력되지 않을 때까지 기다렸다가 출력이 들어 오면 계속 읽습니다.

$ (echo foo; sleep 5; echo test; sleep 5) | grep test

5 초 동안 아무 일도 일어나지 않으면 grep은 일치하는 "test"를 출력 한 다음 5 초 후에 파이프 프로세스가 종료 될 때 종료됩니다.


7

추가 --line-bufferedgrep, 그것은 당신을 위해 지연을 줄일 수 있습니다. 어떤 경우에는 매우 유용합니다.

tail -f foo | grep --line-buffered bar

2
이는 출력이 grep터미널로 이동하지 않을 때 유용합니다 (다른 유형의 파일로 리디렉션 됨). 라인 버퍼링은 출력이 터미널로 갈 때의 기본값이므로 차이가 없습니다. 이 옵션은 GNU 전용입니다.
Stéphane Chazelas


2

나는이 모든 사람들이 사용 tail -f하려고하는 것을 보았지만 그 한계를 좋아하지 않는다! 새로운 줄을 보면서 파일을 검색하는 가장 좋아하는 방법은 다음과 같습니다 (예를 들어, 일반적으로 cron 작업을 통해 주기적으로 실행되는 프로세스의 리디렉션 출력에 추가되는 로그 파일을 사용합니다).

 tail -Fn+0 /path/to/file|grep searchterm

이것은 GNU tail과 grep을 가정합니다. 꼬리 맨 페이지 (GNU coreutils, 내 버전은 v8.22)에서 지원되는 세부 정보 [ https://www.gnu.org/software/coreutils/manual/coreutils.html] :

 -F     same as --follow=name --retry
 -n, --lines=K
         output the last K lines, instead of the last 10; or use -n +K to output
         starting with the Kth.
         If  the first character of K (the number of bytes or lines)
         is a '+', print beginning with the Kth item from the start
         of each file, otherwise, print the last K items in the file.
         K may have a multiplier suffix: b 512, kB 1000, K 1024, MB
         1000*1000, M 1024*1024, GB 1000*1000*1000, G 1024*1024*1024,
         and so on for T, P, E, Z, Y.

  With --follow (-f), tail defaults to following the file descriptor,
  which means that even if a tail'ed file is renamed, tail will
  continue to track its end.  This default behavior is  not  desirable
  when  you  really  want  to  track the actual name of the file, not
  the file descriptor (e.g., log rotation).  Use --follow=name in
  that case.  That causes tail to track the named file in a way that
  accommodates renaming, removal and creation.

따라서 내 명령의 꼬리 부분은에 해당합니다 tail --follow --retry --lines=+0. 여기서 마지막 인수는 시작 부분에서 시작하여 0 줄을 건너 뛰도록 지시합니다.


1
tail -f access | awk '/ADD/{print $0}'

위의 것을 사용하면 보통 사용합니다.


0

netcat을 사용하면 새로운 결과가 쉽게 나오기 때문에 tail -f의 결과를 grep 할 수 있습니다.

sudo nc -s localhost -l -p 1337 | grep ssh


tail -f /var/log/file.log | nc 127.0.0.1 1337

그러면 grep이 포트 1337에서 오는 입력에 대한 결과를 수신하도록 설정합니다.
두 번째 명령은 tail -f의 출력을 netcat로 파이프하여 로컬 호스트 1337로 전송합니다. 로컬로 수행하려면 두 명령 세트 각각에 대해 tty를 전환해야합니다. 또는 화면과 같은 것을 사용하십시오.


0

작동합니다. 그러나 출력이 더 이상 순간적이지 않도록주의하십시오. 파이프를 통해 버퍼링됩니다.


동의했다. 이를 테스트하려면 두 개의 창을여십시오. tail -f한 창과 tail -f logfile | grep pattern다른 창에서 실행하십시오 . 포함 된 줄이 pattern항상 두 창에 동시에 나타나는 것은 아닙니다. 드문 경우지만 30 초 간격으로 선이 나타나는 것을 보았습니다.
Stefan Lasiewski

그것은 꼬리를 하나 또는 다른 인스턴스로 돌리는 것과 시스템이 더 관련이있을 수 있습니다. 더 나은 테스트는 우리 tee나 다른 것입니다.
Kevin Cantu
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.