Linux 강좌 / 텍스트 검색과 가공 - grep, sort, uniq, cut, wc

텍스트에서 필요한 줄을 찾으려면 grep, 줄을 정렬하려면 sort, 인접한 중복 줄을 묶으려면 uniq, 구분된 필드를 뽑으려면 cut, 줄·단어·바이트 수를 세려면 wc를 사용합니다. 이 명령들은 파일을 직접 고치기보다 결과를 표준 출력으로 보내므로, 순서대로 연결하면 작은 텍스트 처리 작업을 만들 수 있습니다.

예제 데이터 만들기

이 강좌는 Bash와 GNU 도구를 기준으로 합니다. ~/linux-course-12-practice가 이미 있다면 다른 이름을 정하세요. 새 디렉터리 생성이 실패하면 뒤의 파일 생성 명령을 계속 실행하지 마세요. >는 기존 파일을 덮어씁니다.

mkdir ~/linux-course-12-practice
cd ~/linux-course-12-practice
pwd

현재 위치를 확인한 뒤, 이름과 상태를 콜론으로 나눈 다섯 줄의 파일을 만듭니다.

printf 'alpha:ready\nbeta:waiting\nalpha:done\ngamma:ready\nbeta:ready\n' > records.txt
cat records.txt

cat의 출력은 입력한 다섯 줄과 같습니다. 이후 예시는 모두 이 파일을 대상으로 합니다.

grep으로 일치하는 줄 찾기

grep은 패턴과 일치하는 줄을 출력합니다. -n을 붙이면 원본 파일의 줄 번호도 표시합니다.

grep -n 'ready' records.txt

이 파일에서는 다음 세 줄이 나옵니다. waiting은 ready를 포함하지 않습니다.

1:alpha:ready
4:gamma:ready
5:beta:ready

grep의 기본 패턴은 정규 표현식이므로 특수 문자를 검색할 때는 의미를 확인해야 합니다. 문자 그대로의 문자열을 찾고 싶다면 grep -F를 사용할 수 있습니다. 일치하는 줄이 없을 때는 보통 종료 상태 1, 명령 자체에 문제가 있으면 2가 반환되므로 ‘출력 없음’을 모두 같은 오류로 취급하지 마세요.

cut으로 필드 분리하고 wc로 수 세기

cut -d: -f1은 콜론을 구분자로 사용해 첫 번째 필드만 출력합니다. 아래 예제에서는 이름만 남습니다.

cut -d: -f1 records.txt
alpha
beta
alpha
gamma
beta

cut은 단순한 구분자 기반 도구입니다. 따옴표 안의 콜론이나 줄바꿈까지 해석해야 하는 복잡한 CSV 파일에는 이 예제를 그대로 적용하면 안 됩니다. wc -l로 파일의 줄 수를 확인하면 다음처럼 파일 이름과 함께 5가 표시됩니다.

wc -l records.txt

wc -w는 단어 수, wc -c는 바이트 수를 셉니다. 특히 한글 같은 여러 바이트 문자는 바이트 수와 문자 수가 다를 수 있습니다. GNU wc -m은 문자 수를 구할 때 사용합니다.

sort와 uniq를 순서대로 연결하기

sort는 줄을 정렬합니다. uniq는 연속해서 나타나는 같은 줄만 하나로 묶으므로, 떨어져 있는 같은 이름을 함께 세려면 먼저 정렬해야 합니다. 파이프 |는 앞 명령의 표준 출력을 다음 명령의 표준 입력으로 전달합니다.

cut -d: -f1 records.txt | sort | uniq -c

출력에서 이름별 횟수는 alpha 2회, beta 2회, gamma 1회입니다. 숫자 앞의 공백과 정렬 순서는 로캘과 구현에 따라 다를 수 있습니다.

      2 alpha
      2 beta
      1 gamma

원본 파일의 줄 전체에 sort | uniq를 적용하면 alpha:ready와 alpha:done은 서로 다른 줄로 남습니다. ‘어떤 단위를 중복으로 볼 것인가’를 먼저 정한 뒤 필요한 필드만 잘라내세요. 정렬 결과는 로캘의 문자 비교 규칙에 영향을 받을 수 있으므로 다른 시스템과 결과를 비교할 때는 로캘도 확인해야 합니다.

어느 명령을 먼저 쓸까요?

목표 도구 핵심 조건
조건에 맞는 줄 grep 패턴이 정규식인지 문자 그대로인지 구별
줄의 순서 정리 sort 로캘과 정렬 기준 확인
중복 묶기·개수 세기 uniq 같은 값이 인접해야 함
단순 구분 필드 추출 cut 구분자와 필드 번호 지정
줄·단어·바이트 수 wc 무엇을 셀지 옵션으로 지정

결과가 비어 있거나 예상과 다르면 먼저 cat records.txt로 원본을 확인하고, 긴 파이프를 각 명령 단계로 나누어 실행해 보세요. 그래야 패턴, 구분자, 정렬 중 어느 단계에서 결과가 달라졌는지 찾기 쉽습니다.

공식 문서

GNU grep 매뉴얼은 패턴과 종료 상태를, GNU Coreutils 매뉴얼은 sort·uniq·cut·wc를 설명합니다.

같은 카테고리의 다른 글
Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux / 명령어 / tracepath - 네트워크 경로와 경로 MTU 확인

Linux tracepath 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux / 명령어 / bg - 중지된 셸 작업을 백그라운드에서 재개

Linux bg 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux / 명령어 / pacman - Arch Linux에서 패키지 설치와 전체 시스템 업데이트

Linux pacman 명령어의 적용 배포판과 기본 작업을 설명합니다. 패키지 조회·설치 예제, 주요 옵션과 시스템 변경 시 주의점을 알아봅니다.

Linux / 명령어 / getent - NSS 사용자·그룹·호스트 정보 조회

Linux / 명령어 / getent - NSS 사용자·그룹·호스트 정보 조회

Linux getent 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux / 명령어 / ss - 열린 포트와 소켓 연결 상태 확인

Linux ss 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / host - 도메인과 IP 주소의 DNS 정보 간단히 조회

Linux / 명령어 / host - 도메인과 IP 주소의 DNS 정보 간단히 조회

Linux host 명령어의 기능과 기본 문법을 설명합니다. 실제 사용 예제, 주요 옵션과 작업 전 확인할 점을 알아봅니다.

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux / 명령어 / join - 공통 필드로 두 파일 결합

Linux join 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어 / uniq - 인접한 중복 행 정리

Linux / 명령어 / uniq - 인접한 중복 행 정리

Linux uniq 명령어의 기본 문법과 실제 사용 예제를 설명합니다. 주요 옵션과 결과를 해석할 때 주의할 점을 확인할 수 있습니다.

Linux / 명령어

Linux / 명령어

리눅스에서 자주 사용하는 명령어를 파일, 텍스트, 권한, 프로세스, 시스템, 디스크, 네트워크와 패키지 관리 작업별로 정리했습니다. 링크가 있는 명령어는 자세한 사용법과 예제를 확인할 수 있습니다.

Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux / 명령어 / ls - 파일과 디렉터리 목록 확인

Linux ls 명령어로 파일과 디렉터리 목록, 숨김 파일, 권한과 소유자, 크기 및 수정 시간을 확인하는 방법을 설명합니다. 자주 쓰는 옵션 조합과 정렬 방법, 스크립트에서 ls 출력을 안전하게 다루는 기준도 정리합니다.