리눅스 텍스트 처리 3대장: grep
, sed
, awk
완전 정복!
리눅스에서 텍스트 데이터를 다룰 때 가장 많이 쓰이는 명령어가 있다. 바로 grep
, sed
, awk
다.
grep
: 특정 패턴이 포함된 행을 찾는 명령어sed
: 텍스트를 찾아서 변경하거나 삭제하는 명령어awk
: 데이터를 필드(컬럼) 단위로 가공하는 명령어
이 글에서는 grep
, sed
를 중심으로 기본 개념과 실전 예제를 다뤄보겠다.
1. grep
명령어: 원하는 문자열 찾기
grep
은 특정 문자열을 포함한 행을 검색하는 명령어다. 로그 파일 분석, 텍스트 필터링 등에 자주 사용된다.
(1) 기본 사용법
1
grep "검색할 문자열" 파일명
예제 파일 (log.txt
):
[INFO] 시스템 시작
[ERROR] 데이터베이스 연결 실패
[WARN] 메모리 사용량 높음
[INFO] 사용자 로그인
[ERROR] 네트워크 응답 없음
ERROR가 포함된 줄만 출력하기:
1
grep "ERROR" log.txt
출력 결과:
[ERROR] 데이터베이스 연결 실패
[ERROR] 네트워크 응답 없음
(2) grep
의 유용한 옵션들
옵션 | 설명 |
---|---|
-i |
대소문자 구분 없이 검색 |
-v |
특정 문자열을 포함하지 않은 행 출력 (부정 검색) |
-n |
검색된 행의 줄 번호 출력 |
-r |
디렉터리 내 모든 파일에서 검색 |
-E |
정규 표현식 사용 가능 (확장된 패턴) |
옵션 예제
✅ 대소문자 무시 (-i
)
1
grep -i "error" log.txt
✅ 특정 단어가 없는 행 찾기 (-v
)
1
grep -v "INFO" log.txt
✅ 줄 번호 함께 출력 (-n
)
1
grep -n "ERROR" log.txt
출력 결과:
2:[ERROR] 데이터베이스 연결 실패
5:[ERROR] 네트워크 응답 없음
✅ 디렉토리 내 모든 파일에서 검색 (-r
)
1
grep -r "ERROR" /var/log
✅ 정규 표현식 사용 (-E
)
1
grep -E "ERROR|WARN" log.txt
출력 결과:
[ERROR] 데이터베이스 연결 실패
[WARN] 메모리 사용량 높음
[ERROR] 네트워크 응답 없음
2. sed
명령어: 텍스트 치환 및 편집
sed
는 텍스트를 찾아 바꾸거나, 특정 패턴을 삭제하는 등 파일을 직접 수정할 때 유용한 스트림 편집기다.
(1) 기본 사용법
1
sed 's/찾을문자열/바꿀문자열/' 파일명
예제 파일 (data.txt
):
이름: 홍길동
이름: 김철수
이름: 이영희
✅ “이름”을 “Name”으로 변경하기
1
sed 's/이름/Name/' data.txt
출력 결과:
Name: 홍길동
Name: 김철수
Name: 이영희
s
는 substitute(치환)을 의미하며,s/기존문자/새문자/
형식으로 사용한다.
(2) sed
의 주요 옵션들
옵션 | 설명 |
---|---|
-i |
원본 파일을 직접 수정 |
g |
파일 내 모든 패턴을 변경 (기본적으로 첫 번째 항목만 변경됨) |
p |
변경된 줄만 출력 |
d |
특정 패턴이 포함된 줄 삭제 |
✅ 파일 내 모든 “이름”을 “Name”으로 변경 (g
옵션)
1
sed 's/이름/Name/g' data.txt
✅ 원본 파일을 직접 수정 (-i
옵션)
1
sed -i 's/이름/Name/g' data.txt
✅ 특정 패턴이 포함된 행 삭제 (d
옵션)
예제 파일 (users.txt
):
홍길동 30 서울
김철수 25 부산
이영희 28 대구
나이가 25인 행 삭제:
1
sed '/25/d' users.txt
출력 결과:
홍길동 30 서울
이영희 28 대구
✅ 특정 컬럼 값만 출력 (-n p
옵션)
1
sed -n 's/서울/Seoul/p' users.txt
출력 결과:
홍길동 30 Seoul
3. awk
란 무엇인가?
awk
는 기본적으로 패턴 매칭과 텍스트 처리에 특화된 스크립트 언어이다. 리눅스에서 awk
를 사용하면 파일이나 입력 스트림에서 원하는 데이터를 쉽게 추출하고 가공할 수 있다.
주요 특징은 다음과 같다:
- 컬럼 기반 처리: 특정 필드를 선택하여 조작할 수 있음.
- 패턴 매칭: 특정 문자열이나 정규 표현식을 활용하여 데이터 필터링 가능.
- 내장 변수 제공:
$1, $2, $NF
등의 변수를 활용하여 특정 컬럼을 다룰 수 있음. - 조건문 및 반복문 지원:
if
,for
,while
등을 활용하여 복잡한 로직 구현 가능.
(1) 기본 구조
1
awk '패턴 { 액션 }' 파일명
예를 들어, 아래와 같은 데이터가 있는 data.txt
파일이 있다고 가정하자.
홍길동 30 서울
김철수 25 부산
이영희 28 대구
awk
를 사용하여 첫 번째 필드(이름)만 출력해보자.
1
awk '{print $1}' data.txt
출력 결과:
홍길동
김철수
이영희
(2) 필드 선택 ($1, $2, ...
)
awk
에서는 $1
, $2
, $3
처럼 $
기호를 사용하여 특정 컬럼을 선택할 수 있다.
1
awk '{print $1, $3}' data.txt
출력 결과:
홍길동 서울
김철수 부산
이영희 대구
(3) 필드 구분자 변경 (-F
옵션)
파일의 데이터가 공백이 아닌 다른 구분자로 되어 있다면 -F
옵션을 활용할 수 있다.
예를 들어, user.csv
파일이 쉼표(,
)로 구분되어 있다면 다음과 같이 처리할 수 있다.
홍길동,30,서울
김철수,25,부산
이영희,28,대구
1
awk -F ',' '{print $1, $2}' user.csv
출력 결과:
홍길동 30
김철수 25
이영희 28
awk
의 조건문과 반복문
(1) 조건문 (if
)
나이가 28 이상인 사람만 출력하고 싶다면 다음과 같이 if
문을 사용할 수 있다.
1
awk '{ if ($2 >= 28) print $1, $2 }' data.txt
출력 결과:
홍길동 30
이영희 28
(2) 반복문 (for
)
awk
에서는 for
문을 활용하여 특정 패턴이 포함된 라인을 찾거나 값을 누적할 수도 있다.
예를 들어, 1번부터 3번 컬럼을 순서대로 출력하는 경우:
1
awk '{ for (i = 1; i <= 3; i++) print $i }' data.txt
awk 실전
(1) 특정 문자열 포함된 행 출력
로그 파일에서 "ERROR"
가 포함된 행만 출력하고 싶다면?
1
awk '/ERROR/ {print}' server.log
(2) 합계 구하기
파일에서 숫자 값을 모두 더하는 예제다.
1
awk '{sum += $2} END {print "총합:", sum}' data.txt
출력 결과:
총합: 83
(3) 행 번호 붙이기
데이터 앞에 행 번호를 추가하려면?
1
awk '{print NR, $0}' data.txt
출력 결과:
1 홍길동 30 서울
2 김철수 25 부산
3 이영희 28 대구
awk
를 활용하면 할 수 있는 것들**
awk
는 단순한 텍스트 처리를 넘어서 로그 분석, 데이터 변환, CSV 파일 처리 등 다양한 분야에서 활용된다. 주요 기능을 다시 정리하면 다음과 같다.
✅ 특정 컬럼 선택 및 출력
✅ 패턴 매칭을 활용한 필터링
✅ 조건문을 이용한 데이터 가공
✅ 데이터 집계 및 합산
✅ 쉼표, 탭 등 다양한 구분자 처리 가능
** 정리: awk
, grep
, sed
비교**
기능 | grep |
sed |
awk |
---|---|---|---|
텍스트 검색 | ✅ | ✅ | ✅ |
패턴 매칭 | ✅ | ✅ | ✅ |
텍스트 치환 | ❌ | ✅ | ✅ |
컬럼 단위 데이터 가공 | ❌ | ❌ | ✅ |
계산 및 데이터 조작 | ❌ | ❌ | ✅ |
✅ 언제 사용해야 할까?
- 단순한 패턴 검색이 필요하다면? →
grep
- 파일을 수정하면서 특정 문자열을 치환해야 한다면? →
sed
- CSV나 로그 파일에서 특정 컬럼을 선택하고 가공해야 한다면? →
awk
마무리
리눅스에서 텍스트를 다루려면 grep
, sed
, awk
는 필수적인 명령어다.
명령어 | 핵심 기능 |
---|---|
grep |
특정 패턴을 포함한 줄을 검색 |
sed |
문자열 치환 및 행 삭제 |
awk |
컬럼 기반 데이터 가공 및 필터링 |
이 세 가지를 잘 활용하면 로그 분석, 데이터 변환, 대량 파일 처리 등 다양한 작업을 자동화할 수 있다.