>와 <가 표준 입출력의 방향을 바꾸는 것이라면, 파이프(|)는 하나의 명령을 실행한 표준 출력을 다른 명령의 표준 입력으로 “흘려보내는” 데 사용됩니다. 이것은 프로세스간의 데이터 통신 방법 중 하나이기도 합니다.

먼저 다음과 같은 경우를 살펴보겠습니다. 우리는 아까의 예에서 test.txt 안에 ‘은’이라는 글자가 들어가는 줄은 2줄이라는 것을 눈으로 확인해 보았습니다. 그렇다면 이런 방법은 어떨까요?

[heyjin@heyjin Work]$ grep 은 test.txt | wc -l 2 [heyjin@heyjin Work]$

wc는 입력 내용에 몇 개의 단어가 존재하는지 세어 주는(word count) 명령입니다. 여기에 line이라는 뜻으로 -l 옵션이 붙으면 몇 줄이 들어 있는지 세어 줄 수 있습니다. 우리가 아까 보았던 test.txt에서의 grep의 사용 예를 다시 보겠습니다.

[heyjin@heyjin Work]$ grep 은 test.txt 이것은 입력과 출력의 방향을 바꾸는 것입니다. 이 내용은 어디에 들어갈까요?

이 결과가 다시 wc -l의 표준 입력으로 들어가면 2라는 결과가 나올 것입니다.

그러면 ‘grep 은 test.txt | wc -l‘ 은 무엇이 다를까요? 먼저 test.txt에서 ’은‘이라는 글자가 들어간 줄이 화면에 보이지 않습니다. 대신 따로 입력도 하지 않은 wc -l의 결과인 2가 출력되었습니다. 파이프는, ’grep 은 test.txt‘의 실행 결과, 즉 표준 출력을 화면에 뿌리는 대신 ‘wc -l’의 표준 입력으로 들어가도록 방향을 바꿔 주었습니다.

우리는 원하는 결과를 얻기 위해 여러 단계를 거쳐야 할 때가 있습니다. 예를 들어, tar로 묶여 있는 파일이 다시 압축이 되어 있다면, 먼저 압축을 풀어 준 후 tar 묶음을 풀어 주어야 합니다. 그 외에도 앞서 실행한 명령의 결과를 새 명령에 입력하는 일이 연쇄적으로 일어나는 경우는 여러 가지가 있을 것입니다. 파이프는 이런 과정을 한 줄로 끝내도록 도와 줍니다.

만약에 우리에게 한 1000명 정도의 전화번호가 들어 있는 call.txt라는 파일이 있다고 합시다.

[heyjin@heyjin Work]$ cat call.txt Y 교수님 | 016-111-2222 홀맨 | 019-999-6666 혜진~ | 017-123-4567 K 교수님 | 011-1111-1111 수끼 | 019-444-4444 세이 | 017-234-5678 TG | 016-222-8888 하안사녀 | 011-987-6543 다엘 | 016-777-7777 웬수 | 011-9999-1111

이 중 특정 통신사의 번호(즉, 011이나 016, 019 등)만 골라내어 다른 파일로 저장하고 싶으면 이렇게 하면 될 것입니다.

[heyjin@heyjin Work]$ cat call.txt | grep 017 > call_017.txt

그러면 한번 살펴볼까요? 먼저 call.txt 파일을 불러들여 읽습니다. 이중 통신망의 식별 번호를 걸러내고요, 이것을 다시 새로운 파일로 저장합니다. 이해가 가시죠? 그러면 call_017.txt를 보도록 하겠습니다.

[heyjin@heyjin Work]$ cat call_017.txt 혜진~ | 017-123-4567 세이 | 017-234-5678

간단하죠? 다음에는 셸에 대해 본격적으로 살펴 보겠습니다. ^^