![변경된 파일을 주기적으로 필터링하고 필터링된 출력을 새 파일로 리디렉션](https://linux55.com/image/202244/%EB%B3%80%EA%B2%BD%EB%90%9C%20%ED%8C%8C%EC%9D%BC%EC%9D%84%20%EC%A3%BC%EA%B8%B0%EC%A0%81%EC%9C%BC%EB%A1%9C%20%ED%95%84%ED%84%B0%EB%A7%81%ED%95%98%EA%B3%A0%20%ED%95%84%ED%84%B0%EB%A7%81%EB%90%9C%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EC%83%88%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EB%A6%AC%EB%94%94%EB%A0%89%EC%85%98.png)
내가 가지고 있다고 가정하자log.txt
log.txt의 샘플 형식은 다음과 같습니다.
Code Data Timestamp
...
C:57 hello 1644498429
C:56 world 1644498430
C:57 water 1644498433
...
문자열이 포함된 행을 필터링하려면 C:57
다음과 같이 할 수 있습니다 .
cat log.txt | grep C:57
그런 다음 출력을 새 파일로 리디렉션합니다.
cat log.txt | grep C:57 > filtered_log.txt
그러나 log.txt에 새로운 변경 사항이 있으면 명령을 다시 반복해야 합니다. 파일에 새로운 변경 사항이 있을 때마다 또는 문자열이 포함된 새 줄이 있을 때만 주기적으로 실행되기를 원합니다 C:57
.
답변1
다음과 같이 사용할 수 있습니다 tail -f
.
tail -f log.txt|grep C:57 >> filtered_log.txt
log.txt
이렇게 하면 태그를 지속적으로 파악 C:57
하고 일치하는 항목을 filtered.log.txt
.
cat
로그를 읽고 이를 파이프하는 데 사용하는 것은 grep
쓸모가 없습니다 cat
. grep
파일을 직접 읽을 수 있습니다. a 와 a 를 결합하면 cat
I/O가 낭비됩니다 grep
.
여기서 한 가지 단점은 필터링된 출력이 버퍼링으로 인해 지연될 수 있다는 것입니다. 이는 다음과 같은 방법으로 피할 수 있습니다.
tail -f log.txt|grep --line-buffered C:57 >> filtered_log.txt
또는 다음 stdbuf -o0
명령을 사용하십시오.
tail -f log.txt|stdbuf -o0|grep C:57 >> filtered_log.txt C:57