Linux - 명령어 모음집

`grep`, `sed`, `awk` 완전 정복!

Posted by Yan on February 18, 2025

리눅스 텍스트 처리 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: 이영희

ssubstitute(치환)을 의미하며, 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 컬럼 기반 데이터 가공 및 필터링

이 세 가지를 잘 활용하면 로그 분석, 데이터 변환, 대량 파일 처리 등 다양한 작업을 자동화할 수 있다.