파이프라인에서 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첫 번째 데이터가 생성 됩니다 . 데이터를 복제하고 teetee복사본을 다음 복사본으로 보내고 tee다른 복사본을 프로세스 대체에 보냅니다. 해당 프로세스 대체는 grep도착하는 데이터에서 실행되고 tee결과는 file 로 이동합니다 CRON.

파이프라인의 마지막 단계도 비슷한 방식으로 작동합니다.


프로세스 대체를 사용할 수 없는 쉘에서(예 /bin/sh: awk또는 ) sed를 사용할 수 있습니다.

와 함께 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'

관련 정보