파일에서 여러 조각을 추출하고 싶거나 조각이 발생해야 하는 경우 최소한 로그 파일을 모니터링하고 싶지만 여러 tail | grep
세션을 설정하고 싶지 않습니다. 대신 각 grep의 출력을 추적하고 싶습니다.
나는 이것을 하는 데 사용할 수 있다고 생각 awk
하지만 아마도 이 아이디어에 더 가까운 것이 이미 있을 것입니다.
예를 들어 명령은 다음과 같습니다.
tail -f /var/log/syslog | teegrep cron1 -f CRON | teegrep cloud-init2 -f CLOUD-INIT
출력은 CRON 및 CLOUD-INIT 파일이 되며 결국 모든 것이 stdout으로 전송됩니다. "cron1" 및 "cloud-init2" 줄이 일치하는 항목만 해당 파일에 나타납니다.
아마도 그것은 이미 명령의 일부인데 내가 그것을 모르는 것일 수도 있습니다. 아니면 동일한 작업을 수행하기 위한 bash/zsh 트릭이 있을 수도 있습니다. 어느 쪽이든: 파이프라인의 티 부분에서 파일과 직접 일치시킬 수 있도록 tee
합계 를 결합하는 명령이 있습니까 ?grep
답변1
쉘에 프로세스 대체가 있다고 가정하면 다음과 같습니다 >(...)
.
tail -f /var/log/syslog |
tee >(grep cron1 >CRON) |
tee >(grep cloud-init2 >CLOUD-INIT)
이렇게 하면 파이프라인의 tail
첫 번째 데이터에 대한 데이터가 생성 됩니다. 데이터를 tee
복사 tee
하고 하나의 복사본을 다음 복사본으로 보내고 tee
다른 복사본을 프로세스 교체로 보냅니다. 프로세스 교체는 grep
의 데이터에서 실행되고 tee
결과는 파일에 기록됩니다 CRON
.
파이프라인의 마지막 단계도 비슷한 방식으로 작동합니다.
예를 들어 프로세스 대체를 사용할 수 없는 쉘에서는 또는를 /bin/sh
사용할 수 있습니다.awk
sed
그리고 awk
:
tail -f /var/log/syslog |
awk '{ print }
/cron1/ { print >"CRON" }
/cloud-print/ { print >"CLOUD-INIT" }'
다음을 사용하십시오 (명령은 항상 파일에 데이터를 추가하므로 sed
출력 파일이 존재하지 않는지 확인해야 합니다 ).w
sed
rm -f CLOUD CLOUD-INIT
tail -f /var/log/syslog |
sed -e '/cloud/w CLOUD' \
-e '/cloud-print/w CLOUD-INIT'