질문이 매우 혼란스럽고 표현이 형편없기 때문에 질문을 다시 표현하고 있습니다...) -:
다음과 같은 로그를 읽는 도커 컨테이너가 있습니다.
docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R"
이제 출력에 "grep"을 사용하고 싶지만 이것이 작동하기 때문에 문제가 발생합니다.
docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R | grep sometext"
이것이 작동하지 않더라도:
docker exec -it my-container sh -c "export TERM=xterm && ls -t /logs/my-log.* | xargs zless -R" | grep sometext
(첫 번째 작업 명령에는 내가 보내는 명령에 grep이 있고 두 번째 작업 명령에서는 출력에 대해 grep을 실행합니다.)
스크립트 내에서 이 명령을 실행하고 있고 이 스크립트의 출력에서 grep이 실행되도록 허용하고 싶기 때문에 이는 나에게 중요합니다.
답변1
스크립트가 "exec -it"을 실행 중입니다. "t"는 tty를 나타냅니다.
zless는 추가 파이프 없이 앞에 tty가 있다고 "생각"하고 있습니다.
't'를 제거하면 문제가 해결되었습니다(이제는 zless 대신 zcat처럼 동작하지만 파이프가 작동하므로 간단히 파이프로 less...).
답변2
파이프의 요점을 정말로 이해하지 못합니다. zless
출력이 다음과 같은 대화형 프로그램입니다 ls
.보고 있다, 구문 분석되지 않았습니다.
대신에:
... sh -c 'zgrep PATTERN /logs/my-log.*'
혹은 파일이 너무 많으면
... sh -c 'for pathname in /logs/my-log.*; do zgrep PATTERN "$pathname"; done'
또는 더 효과적으로,
... sh -c 'find /logs/ -maxdepth 1 -type f -name "my-log.*" -exec zgrep PATTERN {} +'