> 환경 및 유틸리티 > pipe(|)

파이프(|) 완전 정복: 명령어 연결의 핵심 도구

파이프(pipe)는 리눅스/유닉스 셸에서 두 개 이상의 명령어를 연결하여 한 명령어의 표준 출력을 다음 명령어의 표준 입력으로 전달하는 메커니즘입니다. 복잡한 작업을 여러 개의 간단한 명령어로 나누어 순차적으로 처리할 때 사용되는 셸의 핵심 기능 중 하나입니다. 마치 수도관처럼 데이터가 한 방향으로 흐르게 합니다.

파이프 개요

파이프는 리눅스/유닉스 셸에서 사용되는 '|' 기호를 의미하며, 왼쪽 명령어의 결과를 오른쪽 명령어의 입력으로 전달하는 역할을 합니다. 이를 통해 사용자는 여러 개의 명령어를 조합하여 강력하고 유연한 데이터 처리 파이프라인을 구축할 수 있습니다.

파이프의 작동 방식

첫 번째 명령어의 표준 출력(stdout)이 셸에 의해 생성된 임시 버퍼에 저장되고, 이 버퍼의 내용이 두 번째 명령어의 표준 입력(stdin)으로 전달됩니다. 이 과정은 여러 개의 명령어를 연결하여 파이프라인을 형성할 수 있습니다.

파이프의 특징

  • 단방향 흐름: 데이터는 항상 왼쪽에서 오른쪽으로, 한 방향으로만 흐릅니다.
  • 데이터 재활용: 앞선 명령어의 결과를 다음 명령어의 입력으로 즉시 사용할 수 있습니다.
  • 모듈화: 크고 복잡한 작업을 작고 단순한 명령어로 분해하여 처리할 수 있습니다.
  • 효율성: 임시 파일을 생성할 필요 없이 메모리 내에서 데이터를 처리하므로 효율적입니다.

파이프 활용 예시

파이프를 사용하여 여러 명령어를 조합하는 실용적인 예시들을 통해 그 강력함을 경험해 보세요.

파일 목록에서 특정 패턴 검색

ls -l | grep json

`ls -l` 명령어로 현재 디렉토리의 파일 목록을 출력한 뒤, `grep`을 사용하여 'json'이라는 문자열이 포함된 줄만 검색합니다. 이 파이프라인은 `ls -l`의 출력을 `grep`의 입력으로 전달합니다.

프로세스 목록에서 특정 프로세스 찾기

ps aux | grep nginx | grep -v grep

`ps aux` 명령어로 모든 프로세스 목록을 확인한 뒤, `grep`을 사용하여 'nginx' 프로세스만 필터링합니다. 이때 `grep` 자체도 프로세스이므로 `grep nginx` 프로세스는 제외해야 합니다.

가장 큰 파일 5개 찾기

ls -lh | sort -rh | head -5

`ls -lh`로 파일 목록을 상세하게 출력하고, `sort -rh`로 크기(`-h` 옵션 덕분에 사람이 읽기 쉬운 단위로 정렬)를 기준으로 역순(`-r`) 정렬합니다. 마지막으로 `head -5`로 상위 5개 결과만 출력합니다.

현재 디렉토리의 .txt 파일 개수 세기

ls | grep '.txt' | wc -l

`ls`로 파일 목록을 출력하고, `grep`으로 '.txt' 확장자를 가진 파일만 필터링합니다. 마지막으로 `wc -l`로 필터링된 줄(`-l` 옵션)의 개수를 세어 파일의 총 개수를 얻습니다.

파이프와 xargs 조합하여 파일 삭제

find . -name '*.log' | xargs rm

`find` 명령어로 특정 패턴을 가진 파일을 찾은 후, `xargs`를 통해 찾은 파일 목록을 `rm` 명령어의 인자로 전달하여 삭제합니다. 파이프만으로는 `rm`에 인자를 전달하기 어렵기 때문에 `xargs`와 함께 사용됩니다.

리디렉션(Redirection)과의 차이

파이프와 함께 자주 사용되는 리디렉션은 데이터의 흐름을 제어한다는 점에서는 유사하지만, 그 방식에 중요한 차이가 있습니다.

파이프 vs. 리디렉션

  • 파이프 (`|`): 한 명령어의 **출력**을 다른 명령어의 **입력**으로 연결합니다.
  • 리디렉션 (`>`, `>>`): 명령어의 **출력**을 파일로 보내거나, 파일의 내용을 명령어의 **입력**으로 보냅니다.

리디렉션 예시

ls -l > file_list.txt

`ls -l`의 결과를 `file_list.txt` 파일에 저장합니다. 이는 다른 명령어의 입력으로 사용되지 않고, 파일에 직접 기록됩니다.


관련 명령어

기능적으로 유사하거나 함께 자주쓰이는 명령어들입니다.


동일 카테고리 명령어