리눅스 sed와 awk 사용법 (로그 분석, 설정 파일 일괄 수정)
grep으로 원하는 줄을 찾는 것까지는 익숙한데, 그 줄에서 특정 값만 뽑거나 설정 파일의 문자열을 한꺼번에 바꾸려면 막막할 때가 있다. 이럴 때 쓰는 도구가 sed와 awk다. 이 글에서는 서버 관리에서 자주 쓰는 sed awk 사용법 예제를 로그 분석과 설정 파일 수정 중심으로 정리한다. 파일을 찾고 내용을 검색하는 기본은 find와 grep 사용법에 먼저 정리해 두었다.

sed와 awk는 언제 쓰나
| 도구 | 잘하는 일 | 예 |
|---|---|---|
| grep | 조건에 맞는 줄 찾기 | 에러가 있는 줄만 보기 |
| sed | 줄 단위로 바꾸기, 지우기, 일부만 출력 | 설정 파일의 값 일괄 변경 |
| awk | 칸(필드) 단위로 뽑고 계산하기 | 로그에서 IP별 접속 수 세기 |
셋 다 파일을 한 줄씩 읽어서 처리한다는 점은 같다. 찾기는 grep, 바꾸기는 sed, 칸을 나눠 계산하기는 awk라고 기억하면 된다.
sed awk 사용법 1: sed로 문자열 바꾸기
# 화면에만 바꿔서 출력 (원본은 그대로)
sed 's/http:/https:/' site.conf
# 한 줄의 모든 일치를 바꾸기 (g)
sed 's/old/new/g' file.txt
# 파일을 직접 수정하되 .bak 백업 남기기
sed -i.bak 's/^PasswordAuthentication yes/PasswordAuthentication no/' /etc/ssh/sshd_config
# 구분자를 바꿔서 경로 다루기
sed 's|/var/www/old|/var/www/new|g' nginx.conf-i 옵션은 원본 파일을 바로 고친다. 처음에는 -i 없이 결과를 눈으로 확인한 뒤, -i.bak처럼 백업을 남기며 적용하는 습관을 들이자.
줄 지우기와 일부만 출력하기
# 주석(#)과 빈 줄을 빼고 설정만 보기
sed -e '/^#/d' -e '/^$/d' /etc/nginx/nginx.conf
# 10~20번째 줄만 출력
sed -n '10,20p' app.log
# 'ERROR'가 들어간 줄만 출력 (grep 과 같은 효과)
sed -n '/ERROR/p' app.logsed awk 사용법 2: awk로 칸 뽑기
awk는 한 줄을 공백 기준으로 칸을 나눠 $1, $2 같은 이름으로 다룬다. $0은 줄 전체, NF는 칸의 개수, NR은 줄 번호다.
# 1번째, 3번째 칸만 출력
awk '{print $1, $3}' file.txt
# 구분자 지정: /etc/passwd 에서 사용자 이름과 셸
awk -F: '{print $1, $7}' /etc/passwd
# 조건: 3번째 칸이 1000 이상인 줄
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
# 합계와 평균
awk '{sum += $2} END {print "합계:", sum, "평균:", sum/NR}' data.txt실전 예제: Nginx 로그 분석
웹 서버 접속 로그는 한 줄에 IP, 시간, 요청 주소, 상태 코드가 순서대로 들어 있어 awk로 다루기 좋다. 로그 위치는 리눅스 로그 파일 위치에 정리했다.
# 접속이 많은 IP 상위 10개
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head
# 상태 코드별 개수
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -nr
# 404가 난 주소 상위 10개
awk '$9 == 404 {print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head실시간으로 들어오는 로그를 보면서 걸러 내려면 tail -f와 함께 쓰면 된다. 예: tail -f access.log | awk ‘$9 >= 500’.
sed와 awk 함께 쓰기
# 설정 파일에서 주석을 지운 뒤 '키 = 값'의 값만 뽑기
sed '/^#/d' app.conf | awk -F= '/timeout/ {gsub(/ /, "", $2); print $2}'주의할 점
- sed -i는 되돌리기가 없다. 반드시 백업(-i.bak)을 남기거나 Git으로 관리하는 파일에서 쓴다.
- 작은따옴표 안에서는 셸 변수가 풀리지 않는다. 변수를 쓰려면 큰따옴표를 쓰거나 awk -v 옵션으로 넘긴다.
- macOS의 sed는 -i 뒤에 확장자를 반드시 적어야 하는 등 리눅스(GNU)와 옵션이 조금 다르다.
옵션 전체는 GNU sed 매뉴얼과 GNU awk 매뉴얼에서 볼 수 있다.
sed awk 사용법 정리
sed는 “s/찾을것/바꿀것/g”와 -i.bak, awk는 “{print $번호}”와 -F 구분자만 알아도 일상적인 서버 작업의 대부분을 해결할 수 있다. 자주 쓰는 한 줄 명령은 쉘 스크립트로 만들어 두면 더 편하다.
첫 댓글을 남겨보세요