특정 문자열을 찾을 때까지 로그 파일을 추적하고 다른 파일로 출력하는 쉘 스크립트가 있습니까?

특정 문자열을 찾을 때까지 로그 파일을 추적하고 다른 파일로 출력하는 쉘 스크립트가 있습니까?

문자열을 찾을 때까지 tail을 사용하여 로그 파일의 출력을 다른 파일에 써야 합니다.

로그 파일에는 다음이 포함됩니다.

  I am Rahul.
  I have 5 oranges.
  The end.
  Something something.

"마침내"까지는 모든 것을 다른 파일에 쓰고 싶습니다.

tail -f var/log/output.log 
| grep -m 1 "The end" | tee 
Abc.txt 

그러나 abc.txt 파일에는 "End"만 기록됩니다.

답변1

tail -f file | sed '/The end/q' | tee outfile

Sed는 "The end"가 표시될 때까지 모든 줄을 인쇄하고 그 지점에서 종료됩니다.

또한 최근에는AskUbuntu에서 물어보세요.

답변2

grepgrep스트림이나 파일에서 일부 패턴과 일치하는 행을 추출하기 때문에 여기서는 사용할 수 없습니다 .멈추다특정 문자열이 발견되면 출력됩니다. 기본적으로 해당 행 이전의 모든 행과 일치 하고 해당 행 이후의 행과 일치하지 않는 grep일부 패턴을 제공해야 합니다 .The end.


sed '/The end\./q'

The end.이 명령은 문자열이 포함된 행을 볼 때까지 표준 입력 스트림의 각 행을 출력합니다. 이때 마지막 라인이 출력되며, 스크립트 에 있는 명령어를 sed실행하여 명령어가 종료됩니다 .qsed

파이프라인의 일부로:

tail -f var/log/output.log |
sed '/The end\./q' |
tee Abc.txt 

명령의 구현에 따라 tail파이프는 라인을 만나자마자 종료되거나 존재하지 않는 프로세스에 쓰려고 시도하는 The end.즉시 종료됩니다. 즉, 라인이 보이고 라인 이 종료되 자마자 출력 .tail -fsedThe end.sedSomething something.tail -f

tailOpenBSD(POSIX처럼 동작하지 않음 tail)에서는 마지막으로 설명된 동작이 제공되는 반면 GNU는 tail첫 번째 동작( The end.라인을 만나자마자 종료)을 제공합니다.

관련 정보