파이프라인의 tee 부분을 파일과 직접 일치시킬 수 있도록 "tee"와 "grep"을 결합하는 명령이 있습니까?

파이프라인의 tee 부분을 파일과 직접 일치시킬 수 있도록 "tee"와 "grep"을 결합하는 명령이 있습니까?

파일에서 여러 조각을 추출하고 싶거나 조각이 발생해야 하는 경우 최소한 로그 파일을 모니터링하고 싶지만 여러 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사용할 수 있습니다.awksed

그리고 awk:

tail -f /var/log/syslog | 
awk '{ print }
     /cron1/       { print >"CRON" }
     /cloud-print/ { print >"CLOUD-INIT" }'

다음을 사용하십시오 (명령은 항상 파일에 데이터를 추가하므로 sed출력 파일이 존재하지 않는지 확인해야 합니다 ).wsed

rm -f CLOUD CLOUD-INIT

tail -f /var/log/syslog | 
sed -e '/cloud/w CLOUD' \
    -e '/cloud-print/w CLOUD-INIT'

관련 정보