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 / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux / 명령어 / stat - 파일 정보와 메타데이터 확인

Linux stat 명령어로 파일 크기, 권한, 소유자, inode와 타임스탬프를 확인하는 방법을 설명합니다. atime·mtime·ctime·Birth의 차이와 출력 형식, 파일 시스템 조회법도 정리합니다.

Linux / 명령어 / help - 셸 내장 명령어 도움말 확인

Linux / 명령어 / help - 셸 내장 명령어 도움말 확인

Bash help 명령어로 셸 내장 명령과 문법의 도움말을 확인하는 방법을 설명합니다. 출력 형식, 패턴 검색, type·man·--help와의 차이 및 스크립트 활용법을 정리합니다.

Linux / 명령어 / find - 조건으로 파일과 디렉터리 검색

Linux / 명령어 / find - 조건으로 파일과 디렉터리 검색

Linux find 명령어로 경로, 이름, 종류, 크기, 시간과 권한 조건을 조합해 파일을 찾는 방법을 설명합니다. 안전한 exec 사용과 삭제 전 검증도 다룹니다.

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

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

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

Linux / 명령어 / blkid - 블록 장치 UUID와 파일 시스템 형식 조회

Linux / 명령어 / blkid - 블록 장치 UUID와 파일 시스템 형식 조회

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

Linux / 명령어 / dpkg - 로컬 DEB 패키지 설치와 설치 정보 조회

Linux / 명령어 / dpkg - 로컬 DEB 패키지 설치와 설치 정보 조회

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

Linux / 명령어 / shred - 파일 데이터 덮어쓰기

Linux / 명령어 / shred - 파일 데이터 덮어쓰기

Linux shred 명령어로 파일이나 장치의 데이터를 덮어쓰는 방법과 한계를 설명합니다. SSD, 저널링·복사 방식 파일 시스템, 스냅샷 환경에서 완전 삭제를 보장할 수 없는 이유도 알아봅니다.

Linux / 명령어 / comm - 정렬된 두 파일의 공통·고유 행 비교

Linux / 명령어 / comm - 정렬된 두 파일의 공통·고유 행 비교

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

Linux / 명령어 / split - 큰 파일을 크기·행 수별로 분할

Linux / 명령어 / split - 큰 파일을 크기·행 수별로 분할

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

Linux / 명령어 / dig - DNS 레코드와 응답 자세히 조회

Linux / 명령어 / dig - DNS 레코드와 응답 자세히 조회

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