파이프라인은 작은 명령어들을 연결해 중간 파일 없이 데이터가 흐르게 합니다. tee 명령어는 이 흐름의 일부를 파일에 복사하면서 계속 다음 단계로 보낼 수 있습니다.
Text-Fu · 레슨 4
파이프 및 티
파이프라인이 명령어를 연결하는 방식과 tee가 스트림을 저장하면서 다음 단계로 보내는 방법을 배웁니다.
|로 명령어 연결하기
많은 출력을 생성하는 명령어로 시작해 보겠습니다.
$ ls -la /etc
항목 목록이 화면에 다 들어오지 않아 읽기 어려울 수 있습니다. 이 출력을 파일로 리디렉션할 수도 있지만, 더 효율적인 방법은 less와 같은 다른 명령어로 직접 보내 쉽게 보는 것입니다.
$ ls -la /etc | less
파이프 연산자 |는 왼쪽 명령어의 stdout을 오른쪽 명령어의 stdin에 연결합니다. 쉘은 파이프라인 명령어들을 시작하고 스트림 연결을 구성합니다. 명령어는 동시에 작동할 수 있어 ls가 전체 목록을 만들기 전에 less가 읽기 시작할 수 있습니다.
ls -la /etc | less에서 |는 기본적으로 어떤 스트림을 연결하나요?
stderr를 분리해 두기
일반 |는 stdout만 전달합니다. 왼쪽 명령어의 stderr는 흔히 터미널인 기존 목적지를 유지합니다.
$ find /etc -name "*.conf" | less
일치 경로는 파이프로 가지만 권한 진단은 터미널에 직접 나타날 수 있습니다. 다르게 처리하려면 stderr를 별도로 리디렉션합니다.
$ find /etc -name "*.conf" 2> find-errors.log | less
find /etc -name "*.conf" | less에서 별도 리디렉션이 없을 때 find의 stderr는 보통 어디로 가나요?
tee로 스트림 복사하기
출력을 화면에 표시하는 동시에 파일에 저장하고 싶다면 어떨까요? 이때 tee 명령어가 사용됩니다. linux에서 pipe와 tee 명령어는 로깅 및 모니터링을 위한 고전적인 조합입니다.
$ ls | tee listing.txt
listing.txt가 목록을 받고 tee의 stdout은 터미널에 연결된 채로 남습니다. 기본적으로 tee는 >처럼 지정한 파일을 만들거나 잘라냅니다.
generate-report 출력을 표시하면서 같은 출력으로 report.txt를 교체하는 명령어는 무엇인가요?
파일을 교체하지 않고 추가하려면 -a를 사용합니다.
$ date | tee -a activity.log
현재 날짜를 표시하면서 activity.log에 추가하는 명령어는 무엇인가요?
중간 결과 저장하기
tee를 파이프라인 중간에 두면 중간 스트림을 저장하면서 처리를 계속할 수 있습니다.
$ ls -la /etc | tee etc-listing.txt | grep "conf"
이 명령어는 세 가지 작업을 수행합니다.
/etc디렉토리의 내용을 나열합니다.- 해당 출력을
tee로 파이프하여etc_listing.txt에 복사본을 저장하고 동시에 전달합니다. tee에서 나온 출력은grep으로 파이프되어 "conf"를 포함하는 줄을 필터링합니다.
파일에는 grep이 필터링하기 전 데이터가 들어갑니다. 일치하는 줄만 저장하려면 tee를 grep 뒤에 둡니다.
produce | tee all.txt | grep error가 성공적으로 끝나면 all.txt에는 무엇이 들어 있나요?
파이프라인과 스트림 복사는 다음 실습에서 연습해 보세요.
- Linux 에서 입력 및 출력 리디렉션 - 연산자 (예:
>,>>,2>, 및tee명령어) 를 조작하여 명령어의 표준 출력 (stdout), 표준 오류 (stderr), 표준 입력 (stdin) 을 제어하여 데이터 흐름을 연습합니다. - 시퀀스 제어 및 파이프라인 - 명령어 실행 시퀀스를 제어하고, 파이프라인을 활용하며,
cut,grep,wc,sort,uniq와 같은 강력한 텍스트 처리 도구를 활용하는 방법을 배웁니다. - 데이터 스트림 리디렉션 - 표준 입력, 출력 및 오류 스트림 조작, 출력 결합,
/dev/null활용을 포함하여 Linux 스트림 리디렉션 기술을 배웁니다.
레슨 완료
파이프 및 티 완료
이제 명령어를 연결하고 데이터 스트림의 원하는 지점을 보존할 수 있습니다.
한 명령어의 stdout을 다른 명령어의 stdin으로 파이프할 수 있습니다.
필요할 때 stderr를 별도로 리디렉션할 수 있습니다.
tee로 입력을 파일과 stdout에 함께 복사할 수 있습니다.파일을 교체하지 않고
tee -a로 추가할 수 있습니다.필터 앞이나 뒤에
tee를 의도적으로 배치할 수 있습니다.