명령 시퀀스와 파이프라인

LinuxBeginner
지금 연습하기

소개

작은 Linux 명령도 셸이 명령을 조정하면 훨씬 더 유용해집니다. 명령은 종료 상태를 통해 성공 또는 실패를 보고하고, 시퀀스 연산자는 다음에 실행할 명령을 결정하며, 파이프는 한 명령의 표준 출력을 다른 명령의 표준 입력에 연결합니다.

이러한 개념을 한 단계씩 익힌 다음, grep, cut, wc, sort, uniq를 사용해 작은 서비스 이벤트 데이터 세트를 변환합니다. 이후 텍스트 처리 실습에서는 이러한 필터를 더 자세히 다루므로, 여기서는 명령 사이에서 데이터와 판단이 어떻게 전달되는지에 집중합니다.

명령의 종료 상태 확인

이 단계에서는 화면에 나타나는 명령 동작과 셸이 기록하는 숫자 상태를 연결해 확인합니다.

종료 상태 0은 성공을 의미하고, 0 이 아닌 값은 명령이 요청된 작업을 완료하지 못했음을 의미합니다. 성공하는 파일 테스트를 실행한 직후 $?를 출력합니다. $?에는 가장 최근 명령의 상태가 저장됩니다.

cd /home/labex/project/pipeline-lab
test -f events.csv
echo $?

출력은 0입니다. 이제 존재하지 않는 파일을 테스트합니다.

test -f missing.csv
echo $?

종료 상태는 0 이 아닌 값입니다. 이후에 실행하는 모든 명령이 $?를 새 값으로 바꾸므로 $?는 즉시 확인해야 합니다.

if 문을 사용해 상태를 확인하기 쉽게 텍스트로 변환합니다. 전체 셸 스크립팅은 나중에 학습하지만, 여기서는 if 문이 상태를 텍스트로 바꾸는 역할만 수행합니다.

if test -f events.csv; then echo "events.csv is ready"; else echo "events.csv is missing"; fi > status-result.txt
cat status-result.txt

다음에 실행할 명령 제어

이 단계에서는 무조건 실행되는 명령 연산자와 조건부 명령 연산자를 비교합니다.

세미콜론은 이전 명령의 결과와 관계없이 다음 명령을 실행합니다.

false; echo "semicolon continues"

&&는 왼쪽 명령이 성공한 경우에만 오른쪽 명령을 실행합니다.

test -f events.csv && echo "input found"
test -f missing.csv && echo "you should not see this"

||는 왼쪽 명령이 실패한 경우에만 오른쪽 명령을 실행합니다.

test -f missing.csv || echo "input missing"

이 연산자들을 사용하면 간단한 성공/실패 판단을 표현할 수 있습니다. 데이터 세트가 존재할 때만 복사하고, 그렇지 않으면 오류를 출력합니다.

test -f events.csv && cp events.csv working.csv || echo "Copy failed"

조건에 따라 복사된 파일이 원본과 일치하는지 확인합니다.

cmp events.csv working.csv && echo "guarded copy matches" > sequence-result.txt
cat sequence-result.txt

복잡한 논리에는 읽기 쉬운 if 문을 사용하는 것이 좋습니다. 긴 &&/|| 연결은 의미가 모호해질 수 있습니다.

파이프라인으로 출력 전달

이 단계에서는 |로 명령을 연결하고 각 단계에서 데이터 스트림의 범위가 어떻게 좁혀지는지 확인합니다.

왼쪽 명령은 표준 출력을 파이프에 기록하고, 오른쪽 명령은 해당 데이터를 표준 입력으로 읽습니다. ERROR 레코드만 선택합니다.

cd /home/labex/project/pipeline-lab
cat events.csv | grep ',ERROR,'

grep은 파일을 직접 읽을 수 있으므로 다음처럼 더 짧게 작성해도 같은 결과가 나옵니다.

grep ',ERROR,' events.csv

wc -l을 추가해 일치하는 줄 수를 셉니다.

grep ',ERROR,' events.csv | wc -l

필터링된 스트림과 개수를 모두 저장합니다. tee는 표준 입력을 복제합니다. 복사본 하나는 error-events.csv에 기록하고, 다른 복사본은 표준 출력을 통해 다음 단계로 전달합니다. 따라서 마지막 wc -l은 저장된 줄과 정확히 같은 줄 수를 셉니다.

grep ',ERROR,' events.csv | tee error-events.csv | wc -l > error-count.txt
cat error-events.csv
cat error-count.txt

파이프라인이 끝난 후 두 파일을 모두 확인합니다. error-events.csv에는 일치하는 레코드가 들어 있고, error-count.txt에는 해당 레코드의 개수가 들어 있습니다.

Cut 으로 필드 추출

이 단계에서는 각 CSV 줄을 구분자로 나뉜 필드로 처리합니다.

cut -d, -f1은 쉼표를 구분자로 사용하고, 첫 번째 필드인 서비스 이름을 출력합니다.

cd /home/labex/project/pipeline-lab
cut -d, -f1 events.csv

서비스 필드와 심각도 필드를 함께 출력합니다.

cut -d, -f1,2 events.csv

필터링과 추출을 결합해 경고를 생성한 서비스만 나열합니다.

grep ',WARN,' events.csv | cut -d, -f1

이 중간 결과를 저장합니다.

grep ',WARN,' events.csv | cut -d, -f1 > warning-services.txt
cat warning-services.txt

필드 내부에 구분자가 나타나지 않는 단순한 레코드에는 cut이 잘 작동합니다. 더 복잡한 형식에는 awk 또는 형식을 인식하는 도구가 필요할 수 있습니다.

반복 값 정렬 및 개수 세기

이 단계에서는 완전한 빈도수 파이프라인을 만들고, uniq 앞에 정렬이 필요한 이유를 이해합니다.

uniq서로 인접한 동일한 줄만 하나로 합칩니다. 먼저 서비스 이름을 추출한 다음, 동일한 값이 서로 이웃하도록 정렬합니다.

cd /home/labex/project/pipeline-lab
cut -d, -f1 events.csv | sort

uniq -c를 추가해 연속해서 나타나는 동일한 이름의 개수를 셉니다.

cut -d, -f1 events.csv | sort | uniq -c

개수를 내림차순으로 숫자 정렬합니다. sort -k1,1nr은 첫 번째 필드를 숫자 기준의 역순 정렬 키로 사용합니다.

cut -d, -f1 events.csv | sort | uniq -c | sort -k1,1nr

최종 보고서를 저장합니다.

cut -d, -f1 events.csv | sort | uniq -c | sort -k1,1nr > service-frequency.txt
cat service-frequency.txt

이 파이프라인을 왼쪽에서 오른쪽으로 읽습니다. 추출 → 정렬 → 인접한 중복 항목 개수 세기 → 개수 순위 매기기입니다.

요약

셸의 성공 신호로 종료 상태를 사용하고, ;, &&, ||로 실행을 제어했으며, 각 단계가 명확한 파이프라인을 구성했습니다. 그런 다음 레코드를 필터링하고, 필드를 추출하고, 줄 수를 세고, 값을 정렬하고, 중복 항목의 개수를 셌습니다. 이러한 명령은 다음 데이터 파이프라인 Challenge 에 필요한 기본 도구입니다.