본문 바로가기

언어/Bash

[ Bash ] 파이프 라인 사용하기

반응형

유닉스의 파이프라인(Pipeline)은 여러 명령을 연결하여 한 명령의 출력을 다음 명령의 입력으로 사용하는 강력한 기능입니다. 이 기능을 사용하면 복잡한 작업을 여러 개의 간단한 명령으로 분할하여 처리할 수 있으며, 효율적이고 유연한 데이터 처리를 가능하게 합니다. 파이프라인은 쉘에서 | (파이프) 기호를 사용하여 구현됩니다.

1. 유닉스 파이프라인의 기본 개념

파이프라인은 두 개 이상의 명령을 연결하여, 앞 명령의 표준 출력(standard output, stdout)을 뒤 명령의 표준 입력(standard input, stdin)으로 전달하는 방식입니다. 이를 통해 여러 명령을 조합하여 강력한 데이터 처리 흐름을 만들 수 있습니다.

2. 기본 구조:

command1 | command2 | command3 ...
  • command1의 출력은 command2의 입력으로 전달됩니다.
  • command2의 출력은 command3의 입력으로 전달됩니다.
  • 이렇게 연결된 각 명령은 독립적으로 실행되며, 첫 번째 명령의 출력이 다음 명령의 입력으로 사용되는 방식으로 연속됩니다.

3. 파이프라인의 사용 예

파이프라인은 파일 처리, 데이터 변환, 시스템 관리 등 다양한 작업에서 사용됩니다. 몇 가지 일반적인 사용 예를 살펴보겠습니다.

예시 1: 텍스트 파일의 내용 필터링

파일 example.txt의 내용을 읽고 특정 패턴을 포함하는 줄만 출력하고 싶을 때:

cat example.txt | grep "pattern"
  • cat example.txt: example.txt 파일의 내용을 출력합니다.
  • grep "pattern": cat 명령의 출력을 입력으로 받아, pattern을 포함하는 줄만 필터링하여 출력합니다.

예시 2: 디렉터리 내 파일 목록 정렬

현재 디렉터리의 파일 목록을 크기 순으로 정렬하고 싶을 때:

ls -l | sort -k 5 -n
  • ls -l: 디렉터리의 자세한 파일 목록을 출력합니다.
  • sort -k 5 -n: ls -l 명령의 출력을 입력으로 받아, 5번째 열(파일 크기)을 기준으로 숫자 순으로 정렬합니다.

예시 3: 특정 조건에 맞는 프로세스 찾기

시스템에서 실행 중인 프로세스 중 특정 조건에 맞는 프로세스를 찾고 싶을 때:

ps aux | grep "keyword"
  • ps aux: 현재 시스템에서 실행 중인 모든 프로세스 정보를 출력합니다.
  • grep "keyword": ps aux 명령의 출력을 입력으로 받아, keyword를 포함하는 프로세스 정보를 필터링하여 출력합니다.

예시 4: 명령어 출력의 통계 처리

텍스트 파일에서 단어의 개수를 세고, 고유 단어의 수를 세고 싶을 때:

cat example.txt | tr ' ' '\n' | sort | uniq -c | sort -nr
  • cat example.txt: example.txt 파일의 내용을 출력합니다.
  • tr ' ' '\n': 공백을 줄 바꿈으로 바꿔서 각 단어를 한 줄에 하나씩 위치시킵니다.
  • sort: 단어를 정렬합니다.
  • uniq -c: 고유한 단어를 세고, 각 단어가 몇 번 나타났는지 출력합니다.
  • sort -nr: 카운트된 결과를 숫자 순서대로 내림차순으로 정렬합니다.

4. 파이프라인의 특징

  1. 명령 간의 데이터 흐름:
    • 파이프라인은 명령 간의 데이터 흐름을 자동으로 관리합니다. 각 명령의 출력이 다음 명령의 입력으로 바로 전달되므로, 중간에 파일로 저장하거나 읽을 필요가 없습니다.
  2. 효율성:
    • 파이프라인을 사용하면 큰 데이터를 처리할 때 메모리 사용량을 줄이고, I/O 작업을 줄여 효율적으로 처리할 수 있습니다. 중간에 파일을 생성하지 않으므로 디스크 공간도 절약됩니다.
  3. 단일 작업으로 여러 명령 수행:
    • 여러 명령을 조합하여 복잡한 작업을 하나의 파이프라인으로 수행할 수 있습니다. 이는 간단한 명령을 조합하여 복잡한 문제를 해결하는 유닉스 철학과도 일치합니다.

5. 파이프라인의 고급 사용법

파이프라인은 단순한 명령 연결 외에도, 다양한 유닉스 도구를 결합하여 더 복잡한 작업을 수행할 수 있습니다.

예시 5: 텍스트 데이터의 정렬 및 중복 제거

텍스트 파일에서 단어의 출현 빈도를 계산하고, 가장 자주 등장하는 단어를 찾아내고 싶을 때:

cat example.txt | tr -s ' ' '\n' | sort | uniq -c | sort -nr | head -10
  • tr -s ' ' '\n': 여러 개의 공백을 하나의 줄 바꿈으로 바꿉니다.
  • head -10: 최종 정렬된 결과에서 상위 10개의 단어만 출력합니다.

예시 6: 로그 파일에서 특정 기간의 로그 필터링

로그 파일에서 특정 기간 동안 발생한 로그만 필터링하고 싶을 때:

grep "2024-06-01" /var/log/syslog | grep "ERROR"
  • grep "2024-06-01": 로그 파일에서 2024년 6월 1일에 해당하는 로그만 필터링합니다.
  • grep "ERROR": 필터링된 로그 중에서 ERROR 문자열을 포함하는 로그만 출력합니다.

6. 파이프라인과 서브셸

파이프라인의 각 명령은 별도의 프로세스에서 실행되므로, 명령 간의 변수나 상태는 공유되지 않습니다. 이를 이해하기 위해 서브셸(subshell)의 개념을 알아야 합니다.

예시 7: 파이프라인과 변수 사용

파이프라인 내에서 변수의 값을 변경해도, 해당 변수는 원래의 셸에 영향을 주지 않습니다.

count=0
echo "Hello World" | while read line; do
  count=$((count + 1))
done
echo $count

위의 예시에서 count는 파이프라인 내의 while 루프 안에서 증가하지만, 루프가 종료된 후에는 count의 값은 여전히 0입니다. 이는 while 루프가 서브셸에서 실행되기 때문입니다.

7. 파이프라인의 제한 사항

  1. 명령 간 변수 공유:
    • 파이프라인의 각 명령은 별도의 프로세스에서 실행되기 때문에, 명령 간에 변수를 직접 공유할 수 없습니다. 이를 해결하려면 파일이나 다른 IPC(Inter-Process Communication) 메커니즘을 사용해야 합니다.
  2. 에러 핸들링:
    • 파이프라인에서 한 명령이 실패하면, 기본적으로 그 이후의 명령은 계속 실행됩니다. 이를 방지하려면 set -o pipefail 옵션을 사용하여 파이프라인의 어느 한 명령이라도 실패할 경우 전체 파이프라인이 실패하도록 설정할 수 있습니다.

8. 요약

유닉스의 파이프라인은 여러 명령을 조합하여 복잡한 작업을 간단하게 처리할 수 있는 강력한 도구입니다. 파이프라인을 사용하면 데이터 흐름을 관리하고, 효율적으로 작업을 수행할 수 있습니다. 이를 통해 유닉스 시스템에서 데이터 처리와 관리 작업을 더욱 쉽게 수행할 수 있습니다.

반응형