우분투 · 리눅스 입문 — 23편 (고급)

리눅스 텍스트 처리 3종 — grep·sed·awk 실전

찾기는 grep, 바꾸기는 sed, 열로 잘라 계산은 awk. 로그·CSV·설정 파일을 명령 한 줄로 주무르는 도구들입니다.

2026년 5월 13일 · 약 8분 · 26편 입문 시리즈 23편

app.log 를 grep | awk | sort | uniq 로 분석하고 sed -i.bak 으로 설정 파일을 바꾸는 터미널 화면 일러스트 — grep·sed·awk 실전을 상징

12편(파이프·리다이렉션)에서 명령을 | 로 엮는 법을 봤고, 21~22편에서 셸 스크립트를 짰죠. 그 스크립트 안에서 — 로그를 뒤지고, 설정 파일을 고치고, CSV의 어떤 열을 합산하는 — 텍스트 작업을 하려면 이 세 도구가 거의 다입니다. grep(찾기) · sed(바꾸기) · awk(열로 자르고 계산). 셋 다 작은 도구지만, | 로 엮으면 어마어마합니다.

먼저: 7편(텍스트 명령어 — grep 맛보기)·12편(파이프)·22편(스크립트)을 봤다면 이어집니다. 모든 예제는 연습용 파일에 안전하게 해볼 수 있어요(sed -i 같은 "파일 직접 수정"만 백업 주의 — 본문에서 다룸). 순서 — ① grep 찾기 → ② sed 바꾸기 → ③ awk 열·계산 → ④ 셋을 파이프로 엮기.

grep — 찾기

가장 많이 쓰는 도구. grep "패턴" 파일 — 패턴이 들어 있는 줄만 출력합니다.

$ grep "ERROR" app.log # ERROR 가 들어간 줄 $ grep -i "error" app.log # -i: 대소문자 무시 (ERROR/Error/error 다) $ grep -v "DEBUG" app.log # -v: 패턴이 "없는" 줄만 $ grep -n "TODO" *.py # -n: 줄 번호 같이, 여러 파일이면 파일명도 $ grep -rn "api_key" . # -r: 폴더 안 전부 재귀로 $ grep -c "200" access.log # -c: 매치 줄 "개수"만

정규식을 알면 더 강해집니다. 기본 메타문자: ^(줄 시작) $(줄 끝) .(아무 한 글자) *(앞 문자 0회 이상) [0-9](숫자 한 자) [a-zA-Z](영문 한 자). 그리고 -E(확장 정규식)를 붙이면 |(또는) +(1회 이상) ?(0~1회) ()(그룹) {2,4}(반복 횟수)까지 쓸 수 있어요:

$ grep "^ERROR" app.log # 줄이 ERROR 로 시작 $ grep -E "ERROR|WARN|FATAL" app.log # 셋 중 하나라도 $ grep -oE "[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+" access.log # -o: 매치한 부분만 → IP 추출
자주 쓰는 조합: grep -i(대소문자 무시) · grep -v(제외) · grep -rn(코드 전체에서 찾기) · grep -c(개수) · grep -oE(추출). 그리고 다른 명령의 출력을 거를 땐 파이프로 — ps aux | grep nginx, history | grep ssh 처럼. 12편의 | 가 여기서 빛납니다.

sed — 바꾸기·지우기

sed의 90%는 치환입니다: sed 's/찾을것/바꿀것/'. 슬래시가 구분자예요(다른 문자도 됨: s|a|b|).

$ echo "hello world" | sed 's/world/리눅스/' # → hello 리눅스 $ sed 's/DEBUG=false/DEBUG=true/' .env # 첫 매치만 (한 줄에 한 번) $ sed 's/ /_/g' names.txt # g: 줄마다 모든 공백을 _ 로 $ sed 's/^#//' config.conf # 줄 맨 앞 # 지우기 (주석 해제) $ sed -n '5p' file.txt # -n + p: 5번째 줄만 출력 $ sed '2d' file.txt # 2번째 줄 삭제(출력에서) $ sed '/^$/d' file.txt # 빈 줄(^$) 모두 삭제 $ sed '/DEBUG/d' app.log # DEBUG 들어간 줄 삭제
⚠️ sed -i 는 파일을 직접 고칩니다 — 되돌릴 수 없어요. 반드시 백업과 함께: sed -i.bak 's/old/new/' filefile.bak 이 생기고 file 이 수정됩니다. 또는 먼저 -i 없이 돌려서 출력으로 확인한 다음에만. rm -rf 만큼이나 sed -i 도 "한 번 더 생각"이 필요한 명령입니다(6편 참고).

awk — 열로 자르고 계산

awk는 줄을 공백 기준으로 열로 쪼개 줍니다. $1=첫 열, $2=둘째 열, … $0=줄 전체. 콤마 구분이면 -F',':

$ awk '{print $1}' access.log # 각 줄의 첫 열만 (보통 IP) $ awk '{print $1, $4}' access.log # 1열과 4열 (콤마 = 공백으로 구분 출력) $ awk -F':' '{print $1}' /etc/passwd # : 구분 → 사용자 이름 목록 $ awk -F',' 'NR>1 {print $2}' data.csv # NR=줄번호, NR>1 → 헤더 빼고 2열 $ awk '$3 > 100' sales.txt # 3열이 100 초과인 줄만 (조건만 쓰면 그 줄 출력) $ awk '{sum += $2} END {print sum}' sales.csv # 2열 다 더해서, 끝에 합계 출력 $ awk '/ERROR/ {c++} END {print c}' app.log # ERROR 줄 개수 (grep -c 와 같지만 더 유연)

패턴은 { 동작 } 앞에 붙으면 "그 패턴 줄에서만 동작", BEGIN {}·END {} 는 시작·끝에 한 번. 변수는 그냥 쓰면 됨(자동 0/빈값). 사실상 작은 프로그래밍 언어라, 셋 중 제일 강력하지만 그만큼 배울 게 많아요 — 위 패턴 대여섯 개만 알아도 일상의 90%는 됩니다.

셋을 파이프로 엮기 — 그리고 정리

진짜 힘은 조합입니다. grep 으로 거르고 → awk 로 열을 뽑고 → sort | uniq -c | sort -rn 으로 집계:

# 로그에서 가장 많이 난 ERROR 유형 Top $ grep "ERROR" app.log | awk '{print $4}' | sort | uniq -c | sort -rn 42 timeout 17 db_conn 9 auth # 접속 로그에서 IP별 요청 수 Top 10 $ awk '{print $1}' access.log | sort | uniq -c | sort -rn | head -10 # CSV(콤마)에서 2열(금액) 합계, 단 헤더 제외 $ awk -F',' 'NR>1 {s+=$2} END {print "합계:", s}' sales.csv # 설정 파일에서 주석·빈 줄 빼고 실제 설정만 보기 $ grep -v '^#' nginx.conf | sed '/^$/d'
이럴 땐이 도구
특정 패턴이 있는 줄 찾기 / 제외 / 개수 / 추출grep (`-i -v -n -r -c -oE`)
문자열 치환 / 줄 삭제 / 특정 줄만sed (`s/// g`, `/패턴/d`, `-n Np`) — -i는 백업 필수
열(필드)로 잘라 출력 / 조건 / 합계·카운트awk (`$1 $0`, `-F`, `NR`, `조건`, `{s+=$n}END{}`)

시리즈 흐름

  1. 1~22편 입문~고급(스크립트) ✔   23편 텍스트 처리 3종 grep·sed·awk (이 글)
  2. 24편 — 로그와 모니터링(/var/log·journalctl·logrotate·자원 보기) — 오늘 배운 grep·awk 가 거기서 그대로 쓰임
  3. 25편 — 서버 보안 하드닝   26편 — 도커 입문 (완결)

정리하면 — grep은 "찾는다", sed는 "바꾼다", awk는 "열로 자르고 센다". 셋 다 표준으로 깔려 있고, | 로 엮으면 GUI 도구 없이도 로그·데이터를 자유자재로 다룹니다. 위 패턴들을 연습용 파일에 한 번씩 쳐보세요 — 손에 붙으면 "엑셀 열어서 한참 만지던" 일이 한 줄이 됩니다. 24편에서는 이 도구들을 들고 실제 로그를 분석하고 시스템 상태를 보는 법을 다룹니다.

참고: 본 글은 우분투 기본 도구(GNU grep/sed/gawk) 기준이며 2026년 5월 13일에 작성되었습니다. -E(확장 정규식)·-i 동작은 macOS의 BSD 버전과 다를 수 있습니다.

우분투·리눅스 입문 시리즈

찾고·바꾸고·계산하는 세 도구 — 23편입니다. 24편 "로그와 모니터링"으로 이어집니다(거기서 이 grep·awk 가 그대로 쓰여요).

다음 편은 junai.ai/blog 에서 — 26편까지 차례로 올라옵니다.

© 2026 JUNAI · 우분투·리눅스 입문 시리즈 23편 · 본 글은 2026년 5월 13일 기준으로 작성되었습니다.

© 2026 주나이테크(주) @JUNAITECH