프로필사진
DevOps 부트캠프 기록일지
DevOps_04_김재환
04_파이프라인과 리다이렉션이 무엇인지 예시를 들어 설명하세요.
04_파이프라인과 리다이렉션이 무엇인지 예시를 들어 설명하세요.

2023. 3. 10. 11:39부트캠프/DevOps 과제

파이프라인

데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조를 가리킨다. 이렇게 연결된 데이터 처리 단계는 한 여러 단계가 서로 동시에, 또는 병렬적으로 수행될 수 있어 효율성의 향상을 꾀할 수 있다. 각 단계 사이의 입출력을 중계하기 위해 버퍼가 사용될 수 있다.

 

 

대표적인 파이프라인 구조는 다음과 같은 것이 있다.

  • 명령어 파이프라인: 같은 CPU 회로 안에서 여러 명령어들이 단계적으로 수행되는 것을 가리킨다. 각 명령어는 다시 페치, 디코딩, 연산 등의 세부 주기로 나뉘어 각 파이프라인 단계에 의해 수행된다.
  • 그래픽스 파이프라인: 대부분의 그래픽 카드는 그래픽 처리 과정을 3차원 사영, 윈도 클리핑, 셰이딩, 렌더링 등으로 나누어 각각의 하부 모듈에서 병렬적으로 수행한다.
  • 소프트웨어 파이프라인: 한 소프트웨어의 출력이 자동으로 다른 소프트웨어의 입력으로 연결될 경우 이를 소프트웨어 파이프라인이라고 한다. 유닉스 계열 운영체제에서 사용되는 파이프가 대표적이다.

이중에서 linux에 사용할 파이프 용어의 정의는 소프트웨어 파이프라인인 것 같습니다.

 

파이프 프로세스1의 출력 스트림을 프로세스2의 입력 스트림으로 사용할 때 파이프 기호 | 를 사용하여 아래와 같은 형식으로 작성합니다.

 

$ process1 | process2

 

예를 들어 터미널에서 '/bin'으로 이동하여 'ls -l'을 작성하면 많은 파일이 나타납니다. 이 중에서 ssh라는 문자열을 포함한 것들만 확인 하려고 합니다.

 

다시 말해, ls -l 명령으로 표준 출력을 하고, 출력 된 내용을 ssh 이라는 인자를 전달 받는 grep 명령에 표준 입력으로 전달시키는 파이프를 만들어 보겠습니다.

 

$ ls -l | grep ssh

이와 같이 프로세스 간 입/출력을 연결 하고 싶으면 파이프 |를 이용합니다.

 

이처럼 입/출력을 연결하여 자료를 간편화 등 자주 사용되기 때문에 꼭 알아둬야 합니다.

 

리다이렉션(redirection)

컴퓨팅에서 표준 스트림을 사용자 지정 위치로 우회할 수 있는 다양한 유닉스 셸을 포함한 대부분의 명령어 인터프리터에 일반적인 명령이다. 방향 지정, 방향 변경으로도 부른다.

 

리다이렉션은 특정한 문자열들 명령어 사이에 두어서 추가되는 것이 보통이다. 일반적으로, 이러한 문자열들의 문법은 다음과 같다.

명령어1 > 파일1

위의 줄은 명령어1을 실행하며 이로써 나오는 출력물을 파일1로 내보낸다. 기존에 파일1의 존재하는 경우 기존의 파일 내용은 지우고 새롭게 추가된다.

 

파일의 끝에 출력물을 추가하려면 >> 연산자를 이용한다:

명령어1 >> 파일1

다음을 이용하면

명령어1 < 파일1

명령어1을 실행하되, 파일1이 입력의 대상이 된다. (자판을 이용하는 것과는 반대로)

명령어1 < 들어오는파일 > 나가는파일

위의 줄은 두 개의 기능을 수행한다: 명령어1 들어오는파일에서 내용을 불러들인 뒤 나가는파일에 기록한다.

 

예를 들어보자

$ ps aux > ps.txt
# 명령어 > 파일

ps aux 명령의 출력 결과를 ps.txt 파일에 저장합니다. 정확하게 말하자면, ps aux 의 출력 스트림을 ps.txt 이라는 파일로 전환하여 저장하는 것을 의미합니다. 따라서 아래 캡쳐와 같이 ps aux 의 명령의 결과는 콘솔이 아닌 ps.txt 파일에 기록됩니다.

반대의 경우도 가능합니다 예를 들어

$ head < ps.txt
# 명령어 < 파일

head 명령은 파일의 처음 부분을 설명한 라인(line)만큼 출력하는 명령입니다. 기본값으로 10줄이 세팅 되어 있습니다. 따라서 위의 명령을 실행하면 아래 캡쳐본과 같이 ps.txt 의 처음 10줄을 head 의 입력 스트림으로 전환하여 보내게 됩니다.

조금 더 응용하자면 다음과 같이 사용할 수도 있습니다.

$ head < ps.txt > sample.txt
# 명령어1 < 들어오는 파일 > 나가는 파일
  1. ps.txt 의 내용을 head 명령의 입력 스트림으로 전환하여 전송합니다.
  2. head 명령은 입력 받은 ps.txt 의 내용에서 처음 10줄을 출력합니다.
  3. head 명령의 출력 스트림을 sample.txt 파일에 연결합니다.
  4. head 명령의 출력 스트림은 결과를 sample.txt 파일에 저장합니다.

이와 같은 기호를 정리하면 아래와 같습니다.

리다이렉션 기호 방향 의미
> 표준 출력 명령의 결과를 파일로 저장(기존 파일에 덮어씀)
>> 표준 출력(append) 명령의 결과를 기존 파일에 추가
< 표준 입력 파일의 데이터를 명령에 입력

 

파이프와 리다이렉션은 같이 사용도 가능하다.

예를 들어 test폴더에 test1, test2, test3 총 세 개의 파일이 있다고 할 때 test폴더의 파일 리스트 중 test2 파일 이름을 test3 파일에 넣고 싶을 때 파이프와 리다이렉션을 사용할 수 있다.

 

/test$ ls | grep test2.txt > test3.txt

 

명령어 cat을 사용해 test3 파일에 test2.txt.가 들어있는 것을 확인 할 수 있었다.

출처

https://ko.wikipedia.org/wiki/%EB%A6%AC%EB%8B%A4%EC%9D%B4%EB%A0%89%EC%85%98

https://ko.wikipedia.org/wiki/%ED%8C%8C%EC%9D%B4%ED%94%84_(%EC%9C%A0%EB%8B%89%EC%8A%A4)