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를 설명합니다.









