공공부하자개발 · 영어 학습 노트
리눅스
리눅스 명령어리눅스 자체를 익히는 명령 중심 학습0/10 완료
  • 01파일·디렉터리 명령
  • 02텍스트 보기·편집 (less·vi)
  • 03사용자·그룹·권한·sudo
  • 04패키지·시스템 정보 (dnf·rpm)
  • 05프로세스·자원 (ps·top·free·df)
  • 06네트워크 명령 (ip·ss·ping·scp)
  • 07압축·아카이브·검색 (tar·gzip·find)
  • 08셸 활용 (히스토리·별칭·단축키)
  • 09sed · awk 한 줄 처리 (치환·필드·집계)
  • 10링크 · 디스크 · 예약 작업 (ln·mount·crontab)
사이트 소개개인정보처리방침연락처
© 2026 공부하자
홈 › 리눅스 명령어 › 09 / 10

sed · awk 한 줄 처리 (치환·필드·집계)

섹션 7진행 0 / 10
1왜 배우는가2핵심 원리3코드 예제4응용 변형 예제5자주 하는 실수 (Tip)6연습 문제7정리‹ 이전다음 ›

2. 핵심 원리

2.1 sed -n 과 p

sed 는 기본으로 모든 줄을 출력하면서 명령을 적용합니다. -n 으로 자동 출력을 끄고 p 로 원하는 줄만 골라 찍습니다.

명령 동작
sed -n '2p' file 2번째 줄만 출력(-n 없으면 두 번 출력)

2.2 주소 지정 (줄 번호·범위·패턴·$)

주소는 sed 명령 앞에 붙여 적용 범위를 정합니다. 범위·패턴·마지막 줄을 조합해 원하는 구간만 고릅니다.

주소 의미
sed -n '3p' 3번째 줄
sed -n '2,4p' 2~4번째 줄
sed -n '/busan/p' 패턴이 든 줄
sed -n '$p' 마지막 줄
sed -n '10,20p' big.log 큰 파일의 일부만 확인

2.3 d 로 줄 삭제

d 는 주소에 걸린 줄을 삭제하고 나머지를 출력합니다. p 와 반대로 "지울 줄"을 지정합니다.

bash
sed '1d' file          # 1번째 줄 삭제(헤더 제거에 자주 씀)
sed '/daegu/d' file    # 패턴이 든 줄 삭제

2.4 s 치환과 플래그

s/패턴/바꿀값/플래그 가 기본형입니다. 플래그로 범위를 조절합니다.

플래그 의미
(없음) 줄마다 첫 번째 일치만
g 줄마다 모든 일치
2 줄마다 두 번째 일치만
i 대소문자 구분 안 함

구분자 / 가 경로와 겹치면 \|, # 등 다른 문자로 바꿉니다.

bash
sed 's|/opt/app|/srv/app|' file    # / 대신 | 구분자

2.5 -i 로 파일 직접 수정

-i 는 결과를 화면 대신 파일에 바로 씁니다. -i.bak 은 수정 전 파일을 .bak 으로 남깁니다.

bash
sed -i 's/8080/9090/' app.properties        # 원본 바로 수정(백업 없음)
sed -i.bak 's/8080/9090/' app.properties    # 백업 후 수정

Git Bash·GNU sed 기준이며 macOS 기본 sed(BSD) 는 -i 뒤에 확장자를 꼭 붙여야 합니다(-i '' 또는 -i.bak, 붙이지 않으면 오류).

2.6 -e 여러 개, a/i 삽입, c 줄 바꾸기

-e 를 여러 번 쓰면 한 명령으로 여러 치환을 순서대로 적용합니다. a(append) 는 줄 뒤, i(insert) 는 줄 앞에 새 줄을 넣고, c(change) 는 줄 전체를 바꿉니다.

bash
sed -e 's/8080/9090/' -e 's/INFO/DEBUG/' file
sed '2a inserted-after-2' file
sed '2i inserted-before-2' file
sed '2c replaced-line-2' file

2.7 그룹 역참조와 설정 키 값 바꾸기

-E(확장 정규식)에서 ( ) 로 묶은 부분을 \1, \2 로 재사용합니다. 열 순서 바꾸기와 "키는 그대로 두고 값만 바꾸기" 에 씁니다.

bash
echo "kim,seoul,1200" | sed -E 's/([a-z]+),([a-z]+),([0-9]+)/\3,\2,\1/'
# 1200,seoul,kim
sed -E 's/^(spring\.datasource\.username)=.*/\1=prod/' app.properties

키 이름(\1)은 그대로 남기고 = 뒤 값만 바꾸는 패턴은 설정 파일 자동화에서 자주 씁니다.

2.8 awk 필드와 $1 $NF, -F, NR·NF

awk 는 한 줄을 공백으로 나눠 $1, $2 ... 로 다룹니다. $0 은 줄 전체, $NF 는 마지막 필드입니다.

요소 의미
$1 $2 첫 번째·두 번째 필드
$NF 마지막 필드
$0 줄 전체
-F',' 구분자를 콤마로 지정
NR 현재까지 읽은 줄 번호
NF 현재 줄의 필드 개수

2.9 조건 필터와 BEGIN/END

패턴 없이 {} 만 쓰면 조건 자리에 식을 넣어 필터로 씁니다. BEGIN 은 처리 전, END 는 처리 후 한 번만 실행됩니다.

bash
awk 'BEGIN{print "start"} $9 > 200 {print $6, $9} END{print "done"}' access.log

2.10 합계·평균·최댓값, 그룹별 집계, printf

누적 변수는 선언 없이 바로 씁니다. 배열 a[키]+=값 으로 그룹별 합계를 구하고, printf 로 자리 맞춰 출력합니다.

bash
awk -F',' 'NR>1 {sum+=$3; if($3>max) max=$3} END {print sum, sum/(NR-1), max}' sales.csv
awk -F',' 'NR>1 {a[$2]+=$3} END {for (r in a) printf "%-6s %d\n", r, a[r]}' sales.csv

for (키 in 배열) 순서는 정해져 있지 않아 결과를 sort 로 정리하는 편이 안전합니다.

2.11 길이·부분 문자열, 열 재배치

문자열 함수와 필드 출력 순서 바꾸기는 자주 같이 씁니다.

함수/표현 의미
length($1) substr($1,1,2) 첫 필드 길이, 1~2번째 글자
print $3,$1,$2 필드 순서를 바꿔 출력

2.12 조합 파이프라인과 cut 선택 기준

awk 로 값을 뽑고 sed 로 다듬은 뒤 sort | uniq -c | sort -rn 을 붙이면 즉석 집계표가 됩니다. tee 로 화면과 파일에 동시에 남깁니다.

bash
awk '{print $6}' access.log | sed -E 's#^/api/([a-z]+).*#/api/\1#' | sort | uniq -c | sort -rn | tee path_count.txt

구분자로 고정된 열만 뽑을 때는 cut -d',' -f1,3 이 더 짧습니다. 계산·조건·집계가 필요하면 awk 를 씁니다.

핵심 원리
  • 2.1 sed -n 과 p
  • 2.2 주소 지정 (줄 번호·범위·패턴·$)
  • 2.3 d 로 줄 삭제
  • 2.4 s 치환과 플래그
  • 2.5 -i 로 파일 직접 수정
  • 2.6 -e 여러 개, a/i 삽입, c 줄 바꾸기
  • 2.7 그룹 역참조와 설정 키 값 바꾸기
  • 2.8 awk 필드와 $1 $NF, -F, NR·NF
  • 2.9 조건 필터와 BEGIN/END
  • 2.10 합계·평균·최댓값, 그룹별 집계, printf
  • 2.11 길이·부분 문자열, 열 재배치
  • 2.12 조합 파이프라인과 cut 선택 기준
이전 섹션1 왜 배우는가2 / 7다음 섹션3 코드 예제