기타/미분류

리눅스 파이프 이해하기

파이프라는 것은 여러 명령을 혼합하여 사용할 때, 한 명령의 결과가 다른 명령으로 전송되는 통로라고 이해할 수 있다. 따라서, 파이프를 이용하면, 개개의 명령을 나누어 사용하는 것을 한번에 처리할 수 있는 것이다. 실제로 어떤 파일의 입출력이든 간에 파이프 명령은 표준 입출력으로 간주한다.

아래의 예는 파이프를 사용했을 때와 그렇지 않을 때의 번거러움을 간단하게 소개한다. ‘ls’ 같은 어떤 명령의 결과를 소트하기 원한다면, 아래와 같이 입력할 수 있으며, 예제는 -r 옵션을 사용하여 역순으로 정렬하고 있다.

/home/larry/papers# ls
english-list
history-final
masters-thesis
notes
/home/larry/papers# ls > file-list
/home/larry/papers# sort -r file-list
notes
masters-thesis
history-final
english-list
/home/larry/papers#

여기에서, 'ls' 명령의 출력을 파일로 저장했고, 그리고 그 파일에 'sort -r' 을 실행했다. 또한, 'ls'의 데이터를 저장하기 위해 임시적으로 file-list라는 파일을 사용했다.

위의 결과는 여러 단계를 거쳐 원하는 결과를 얻었다. 위와 유사한 명령을 간단하게 할 수 있는 방법은 파이프라인을 사용하는 것이다. 파이프라인은 shell의 또 다른 특징이며, 이것은 “pipe” 안에서 명령어를 서로 연결할 수 있도록 허용한 것이다.

첫 번째 명령의 표준 출력은 두 번째 명령어의 표준 입력으로 직접 보내어진 것이며, 여기에서 우리는 ‘ls’의 표준 출력을 ‘sort’의 표준 입력으로 보낸다. “|”기호는 파이프를 생성하는데 사용된다.

ls | sort -r
notes
masters-thesis
history-final
english-list
/home/larry/papers#

이 명령은 보다 짧고, 입력하기도 간단하다.

또 다른 유용한 예를 사용해 보자.

/home/larry/papers# ls /usr/bin

이것은 파일들이 길게 출력될 것이며, 그것들을 읽기에는 너무 빨리 화면에서 지나갈 것이다. 그러면, /usr/bin의 파일들을 ‘more’를 사용하여 출력시켜 보자.

/home/larry/papers# ls /usr/bin | more

지금, 사용자의 기호대로 파일들의 리스트를 자유롭게 상하 페이지 이동하여 볼 수 있다.

두 명령어 이상을 함께 사용하여 pipe를 할 수 있다. 아래 명령 중 ‘head’는 입력 스트림으로부터 첫 번째 라인이 출력되는 필터이다. 만일, 현재 디렉토리에서 알파벳 순서로 마지막 파일 이름이 출력되기를 원한다면, 이렇게 쓰면 된다.

/home/larry/papers# ls | sort -r | head -1
notes
/home/larry/papers#

여기에 ‘head -1’ 은 받은 입력의 첫 라인을 단순히 출력한다.(이 경우, ‘ls’ 로부터 역순으로 정렬된 것이다.)

역링크