IMG-LOGO
공지사항 :

리눅스 텍스트 스트림의 편집과 변환

lmkfox - 2026-06-18 06:40:51 2 Views 0 Comment

지난 회차에서 우리는 다중 사용자 협업 환경에서 정교하게 파일과 디렉토리의 보안 장벽을 세우는 ACL(접근 제어 목록) 기술에 대해 알아보았습니다. 이제 시스템 내부의 권한 구조를 완벽히 통제할 수 있게 되었으니, 이번에는 리눅스 엔지니어링의 꽃이자 자동화 스크립트 작성의 핵심 무기인 '텍스트 스트림 가공 기술'을 마스터할 차례입니다.

리눅스 서버를 관리하다 보면 수만 줄의 로그 파일에서 특정 필드(예: IP 주소나 에러 코드)만 쏙 뽑아내어 리포트를 만들거나, 수백 개의 설정 파일 안에 있는 특정 문자열을 일괄적으로 변경해야 하는 상황을 자주 마주하게 됩니다.

이때 vi 에디터로 파일을 하나씩 열어 수정하는 것은 비효율적일 뿐만 아니라 자동화가 불가능합니다. 터미널 환경에서 파일 내용을 스트림(Stream) 형태로 받아 실시간으로 깎고, 자르고, 변환해 주는 리눅스 텍스트 가공의 양대 산맥이 바로 sedawk입니다.

이번 7회차에서는 텍스트 스트림 편집의 지존인 두 명령어의 메커니즘과 실무 자동화 예제를 상세히 살펴보겠습니다.

1. sed: 스트림 에디터(Stream Editor)를 이용한 비대화형 문자열 치환

sed는 파일을 직접 열지 않고, 파이프라인이나 파일로부터 텍스트 스트림을 입력받아 라인 단위로 일치하는 패턴을 찾아 수정, 삭제, 삽입 등의 편집을 수행한 후 결과를 출력하는 강력한 도구입니다. 실무에서는 주로 특정 문자열을 다른 문자열로 일치 치환(Find and Replace)할 때 독보적인 효율성을 자랑합니다.

기본 문법 구조

Bash

sed [옵션] 's/찾을_문자열/바꿀_문자열/g' 파일명
  • s: 치환(Substitute) 명령을 의미합니다.

  • g: 글로벌(Global) 옵션으로, 한 줄에 찾을 문자열이 여러 번 등장하더라도 모두 바꾸라는 뜻입니다. (이 옵션이 없으면 각 줄에서 처음 발견된 문자열만 치환됩니다.)

실무 예제 1: 웹 서버 설정 파일의 포트 번호 일괄 변경하기

Nginx 설정 파일(nginx.conf) 내에 기록된 기본 포트 번호 80을 보안 강화를 위해 8080으로 일괄 치환하여 화면에 출력하는 상황입니다.

Bash

sed 's/listen 80;/listen 8080;/g' nginx.conf

주의점: 위 명령어를 실행하면 화면에만 변환된 결과가 출력될 뿐, 실제 nginx.conf 파일 내용은 변경되지 않습니다.

실무 예제 2: 원본 파일 직접 수정 옵션 -i (In-place)

화면 출처에 그치지 않고 실제 파일의 내용을 완전히 덮어써서 수정하고 싶을 때는 -i 옵션을 사용합니다. 이 옵션은 매우 강력하므로, 만약의 사태를 대비해 원본의 백업 파일을 자동으로 생성하도록 구성하는 습관이 필요합니다.

Bash

# 원본 파일 내용을 수정함과 동시에, 원래 파일명 뒤에 .bak을 붙인 백업 파일을 자동 생성
sed -i.bak 's/DEBUG=True/DEBUG=False/g' /var/www/myapp/config.env

명령어가 실행되면 config.env 파일 내부의 디버그 모드는 꺼지고, 오류 발생 시 복구할 수 있는 config.env.bak 파일이 지정된 경로에 안전하게 남게 됩니다.

실무 예제 3: 특정 범위의 줄(Line)만 삭제하기

로그 파일이나 설정 파일에서 불필요한 특정 행 대역을 통째로 걷어내고 싶을 때 d (Delete) 명령을 조합합니다.

Bash

# 1번째 줄부터 10번째 줄까지(1,10) 삭제(d)하고 나머지만 출력
sed '1,10d' /var/log/myapp/output.log

2. awk: 텍스트를 구조화된 데이터로 다루는 패턴 스캔 및 처리 언어

sed가 단순 문자열 치환과 라인 단위 편집에 특화되어 있다면, awk는 단순한 명령어를 넘어 하나의 독립된 '프로그래밍 언어'에 가깝습니다.

awk는 입력받은 텍스트의 각 라인을 공백이나 탭(Tab) 같은 구분자(Delimiter)를 기준으로 여러 개의 필드(Field, 열)로 쪼개어 인식합니다. 데이터베이스의 테이블이나 엑셀의 셀 형태처럼 텍스트를 구조화된 데이터로 처리할 수 있기 때문에, 대용량 로그 분석과 통계 리포트 생성에 최적의 성능을 발휘합니다.

awk의 핵심 변수 규칙

  • $0: 현재 읽어 들인 라인 전체를 의미합니다.

  • $1, $2, $3 ...: 구분자로 쪼개진 첫 번째 열, 두 번째 열, 세 번째 열을 의미합니다.

  • $NF: 현재 라인의 가장 마지막 열(Number of Field)을 뜻합니다. 가변적인 로그 라인에서 끝 필드만 추출할 때 유용합니다.

  • -F: 기본 공백 외에 쉼표(,)나 콜론(:) 등 커스텀 구분자를 지정할 때 사용합니다.

실무 예제 1: 시스템 사용자 목록에서 계정명만 추출하기

리눅스 계정 정보 파일인 /etc/passwd는 각 열이 콜론(:)으로 구분되어 있으며, 맨 첫 번째 열이 사용자 ID입니다.

Bash

# 구분자를 콜론(-F:)으로 지정하고, 첫 번째 열($1)만 인쇄(print)함
awk -F: '{print $1}' /etc/passwd
# 출력 결과:
# root
# bin
# daemon

실무 예제 2: 조건문(If)을 활용한 웹 서버 에러 로그 필터링

Nginx 액세스 로그 파일(access.log)은 일반적으로 공백을 기준으로 데이터가 나열되며, 9번째 열에 HTTP 상태 코드(200, 404, 500 등)가 배치됩니다. 이 중 서버 내부 에러를 나타내는 500번 에러가 발생한 기록의 접속 IP(1번째 열)와 요청 경로(7번째 열)만 포착해 내는 고난도 데이터 정제 시나리오입니다.

Bash

# 9번째 열($9)의 값이 500과 일치한다면, 1번째 열과 7번째 열을 출력하라
awk '$9 == 500 {print $1, $7}' /var/log/nginx/access.log
# 출력 결과 예시:
# 192.168.1.50 /api/v1/checkout
# 211.234.50.11 /login.php

3. sed와 awk의 하모니: 파이프라인 실무 연계 테크닉

두 명령어는 단독으로도 훌륭하지만 다른 리눅스 명령어 및 파이프라인(|)과 체인처럼 엮일 때 강력한 시너지를 발생시킵니다. 인프라 운영 중 자주 쓰이는 대표적인 고급 연계 기법 두 가지를 실전 코드로 살펴보겠습니다.

실전 테크닉 1: 디스크 임계치 초과 시 경고 시스템 구현 (df + awk)

시스템 디스크 용량을 체크하는 df -h 명령어의 출력 결과에서 순수 사용률 숫자만 추출하여, 특정 임계치(예: 80%)를 넘었을 때 경고 메시지를 발생시키는 자동화 인프라 스크립트의 뼈대입니다.

Bash

# 1. df -h 출력 예시 확인
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/nvme0n1p1   50G   42G  8.0G  84% /

# 2. 파이프라인을 통한 정밀 필터링
# 주 디스크가 있는 /dev/ 대역 행만 골라낸 후, 5번째 열(Use%)을 추출하되 
# 퍼센트 기호(%)를 sed로 떼어내고 순수 숫자만 비교하는 구조
df -h | grep "/dev/" | awk '{print $5}' | sed 's/%//g' | awk '$1 > 80 {print "WARNING: Disk usage is over 80%! Current: " $1 "%"}'

실전 테크닉 2: 동적 대량 프로세스 일괄 종료 스크립트 (ps + awk + xargs)

서버 내부에서 비정상적으로 자원을 과도하게 소모하며 좀비화된 특정 프로세스(예: bad_process)들이 수십 개 실행되어 있을 때, 이들의 프로세스 ID(PID)만 awk로 골라내어 한 번에 안전하게 강제 종료시키는 관리자 명령 기법입니다.

Bash

# ps 결과에서 bad_process를 찾고, 2번째 열(PID)만 추출하여 xargs를 통해 kill 명령어로 전달
ps -ef | grep "bad_process" | grep -v "grep" | awk '{print $2}' | xargs kill -9

4. sed와 awk 선택 기준 및 주의사항

  • sed를 선택해야 할 때: 파일 내의 특정 단어, 환경 변수 값을 일괄적으로 교체하거나 시스템 주석을 제거하는 등 '문자열 단위의 단순 가공 및 치환'이 주 목적인 경우에 적합합니다.

  • awk를 선택해야 할 때: 공백, 탭, CSV 등 규격화된 기호로 나뉜 로그 파일에서 '특정 열의 데이터를 비교, 연산, 요약하여 통계 분석 리포트'를 추출해야 할 때 압도적으로 유리합니다.

사용 시 치명적인 실수를 막는 보안 주의점

sed -i 옵션을 스크립트 내에서 무분별하게 사용할 경우, 정규식 패턴 오타 하나로 인해 환경 설정 파일 전체가 알 수 없는 문자로 오염되어 부팅 불가 상태에 빠지거나 데몬이 다운되는 대형 장애가 발생할 수 있습니다.

따라서 가급적이면 변환 결과를 임시 파일에 먼저 저장한 뒤 무결성을 검증하고 원본에 덮어쓰거나, 앞서 소개한 sed -i.bak 형태로 자동 백업 옵션을 강제 적용하여 운영하는 구조적 방어 조치가 반드시 선행되어야 합니다.

5. 요약

리눅스 터미널에서 데이터 스트림을 자유자재로 편집하고 변환하는 능력은 유능한 시스템 엔지니어와 초보자를 가르는 중요한 기준점입니다.

  • sed 's/old/new/g' 조합을 통해 에디터를 켜지 않고도 런타임 중에 핵심 환경 설정 문자열을 일괄 변경하고,

  • awk의 필드 파싱 규칙($1, $NF)과 내부 조건문을 활용하여 기가바이트급 로그 더미 속에서 의미 있는 장애 통계 데이터를 가공해 내며,

  • 이 도구들을 파이프라인(|)으로 유기적으로 연결하여 인프라 상시 모니터링 자동화 체계를 구축해야 합니다.

텍스트 가공 기술을 능숙하게 구사하게 되면 마우스와 그래픽 화면 없이도 텍스트 명령어 몇 줄만으로 인프라의 거대한 데이터를 완벽하게 제어하는 진정한 리눅스 마스터의 반열에 오르게 될 것입니다. 다음 8회차에서는 이렇게 가공된 스크립트들과 현재 서버 안에서 돌아가는 프로그램들이 자원을 얼마나 소모하고 있는지 실시간으로 추적하고 감시하는 '시스템 프로세스 실시간 감시(ps, top, htop)' 기술에 대해 자세히 알아보겠습니다.


댓글