본문 바로가기
IT

[리눅스 기초 #22] 터미널의 엑셀과 메모장: sed와 awk로 텍스트 데이터 주무르기

by sunyjiny 2026. 2. 1.
반응형

 

리눅스 기초 시리즈의 22번째 시간입니다! 지난 시간까지 우리는 터미널을 예쁘게 꾸미고(PS1), 시스템의 상태를 살피는(top, htop) 등 '환경'에 익숙해지는 시간을 가졌습니다. 이제는 리눅스의 진짜 강력함, 바로 **'데이터 처리'**의 세계로 깊이 들어가 볼까 합니다.

서버에서 개발하다 보면 수백MB짜리 로그 파일을 열어 특정 에러 코드만 추출하거나, 수십 개의 설정 파일에서 IP 주소만 일괄 변경해야 하는 상황이 반드시 옵니다. 이걸 윈도우 메모장으로 하나씩 열어서 수정하실 건가요? 오늘은 리눅스 터미널이 숨겨둔 두 자루의 명검, **sed**와 **awk**를 소개합니다.


1. 나의 경험담: "50개의 설정 파일, 그리고 야근의 위기"

 

제 블로그 sunyjini.com의 서버를 이전하던 때의 일입니다. 데이터베이스 연결 주소가 localhost에서 특정 내부 IP로 변경되었는데, 이 설정이 무려 50개가 넘는 웹 서버 설정 파일(*.conf)에 분산되어 있었습니다.

처음엔 nano 에디터로 하나씩 열어서 수정하다가, 10번째 파일쯤에서 현타(현실 자각 타임)가 왔습니다. "내가 지금 뭐 하고 있는 거지? 이러다 밤새우겠네."

그때 선배가 알려준 sed 명령어 한 줄은 그야말로 마법이었습니다. 엔터를 누르는 순간, 0.1초 만에 50개 파일의 모든 주소가 완벽하게 변경되었으니까요. 그날 이후 저는 텍스트를 다룰 때 절대 에디터부터 켜지 않는 습관이 생겼습니다.


2. sed: 강력한 '한 방' 검색 및 치환기

**sed (Stream Editor)**는 주로 **'문자열 치환'**에 특화된 도구입니다. 메모장의 '찾아 바꾸기(Ctrl+H)' 기능을 터미널에서, 그것도 대량의 파일에 대해 수행한다고 보시면 됩니다.

기본 문법: sed 's/찾을문자/바꿀문자/g' 파일명

(여기서 s는 substitute(치환), g는 global(한 줄에 여러 개 있어도 다 바꿈)을 의미합니다.)

실험 코드: 설정 파일 내용 바꿔치기

Bash
 
# 1. 실험용 더미 설정 파일 생성
echo "db_host = localhost" > config.conf
echo "app_mode = dev" >> config.conf
echo "Another localhost entry here" >> config.conf

# 2. 'localhost'를 '192.168.1.100'으로 변경하여 화면에 출력 (원본은 안 바뀜)
sed 's/localhost/192.168.1.100/g' config.conf

# 3. [주의] 원본 파일 자체를 수정하려면 -i 옵션 사용 (덮어쓰기)
# sed -i 's/localhost/192.168.1.100/g' config.conf

⚠️ 주의사항: -i 옵션은 되돌릴 수 없습니다! 중요한 파일이라면 반드시 백업 후 사용하거나, -i.bak처럼 사용하여 백업 파일을 자동으로 만들게 하세요.


3. awk: 터미널 속의 '엑셀(Excel)'

sed가 행 단위로 문자를 바꾼다면, **awk**는 데이터를 '열(Column, 필드)' 단위로 쪼개서 처리하는 데 최적화되어 있습니다. 공백이나 콤마(,)로 구분된 로그 파일이나 CSV 데이터를 다룰 때 엑셀보다 훨씬 빠르고 강력합니다.

핵심 개념: awk는 각 줄을 읽어서 공백을 기준으로 $1(첫 번째 열), $2(두 번째 열)... 로 인식합니다. ($0은 그 줄 전체를 의미합니다.)

실험 코드: ls -l 결과에서 원하는 열만 뽑아내기

우리가 자주 쓰는 ls -l 명령어를 입력하면 권한, 소유자, 크기, 날짜, 파일명 등이 쭉 나옵니다. 여기서 '파일 크기($5)'와 '파일명($9)'만 보고 싶다면?

Bash
 
# 1. 현재 폴더 파일 목록 확인 (복잡함)
ls -l

# 2. awk를 이용해 5번째 열(크기)과 9번째 열(이름)만 출력
ls -l | awk '{print $5, $9}'

# 출력 예시:
# 4096 .
# 220 .bash_logout
# 3771 .bashrc
# 59 config.conf

(▲ Action: 파이프(|)를 통해 ls -l의 결과를 awk에 넘겨주면, awk는 마치 엑셀처럼 데이터를 열 단위로 인식하여 내가 원하는 정보만 깔끔하게 재가공해 보여줍니다.)


4. sed vs awk: 언제 무엇을 써야 할까?

처음엔 헷갈릴 수 있습니다. 간단한 기준을 드립니다.

도구 별명 추천 상황 핵심 기능
sed 터미널 메모장 "특정 단어를 다른 단어로 싹 다 바꾸고 싶어." 단순 치환 (s///g)
awk 터미널 엑셀 "로그에서 3번째 칸에 있는 IP 주소만 뽑고 싶어." 열 단위 데이터 추출 및 계산

5. 마치며: 텍스트를 지배하는 자가 리눅스를 지배한다

리눅스 시스템의 모든 설정과 로그는 '텍스트 파일'로 되어 있습니다. 즉, 텍스트를 자유자재로 다룰 줄 안다는 것은 리눅스 시스템 전체를 통제할 능력을 갖췄다는 뜻입니다.

sed와 awk는 깊게 파고들면 각각 책 한 권이 나올 만큼 방대한 기능을 가진 '프로그래밍 언어'입니다. 하지만 오늘 배운 기본기(s///g 치환, {print $N} 출력)만 익혀도 여러분의 퇴근 시간은 획기적으로 빨라질 것입니다.

오늘의 인사이트: "반복적인 텍스트 수정 작업이 생기면 본능적으로 에디터를 켜지 말고, 터미널에 물어보라. sed나 awk가 1초 만에 해결해 줄 것이다."

리눅스 기초 22번째 이야기를 마칩니다. 이제 여러분은 데이터를 가공할 수 있는 강력한 무기를 손에 넣었습니다. 다음 시간에는 이 무기들을 활용해 **'두 개의 파일 내용을 비교하고 차이점을 찾아내는 diff 명령어'**에 대해 다뤄보겠습니다. 개발자에게 필수인 코드 리뷰의 기초가 되는 명령어죠.

오늘 내용이 조금 어려웠나요? sed와 awk는 원래 진입 장벽이 조금 있습니다. 하지만 한 번 익혀두면 평생 써먹는 기술입니다. 혹시 이해가 안 가는 부분이나 더 복잡한 예제가 필요하다면 댓글로 남겨주세요!

반응형