sed 는 기본으로 모든 줄을 출력하면서 명령을 적용합니다. -n 으로 자동 출력을 끄고 p 로 원하는 줄만 골라 찍습니다.
| 명령 | 동작 |
|---|---|
sed -n '2p' file |
2번째 줄만 출력(-n 없으면 두 번 출력) |
주소는 sed 명령 앞에 붙여 적용 범위를 정합니다. 범위·패턴·마지막 줄을 조합해 원하는 구간만 고릅니다.
| 주소 | 의미 |
|---|---|
sed -n '3p' |
3번째 줄 |
sed -n '2,4p' |
2~4번째 줄 |
sed -n '/busan/p' |
패턴이 든 줄 |
sed -n '$p' |
마지막 줄 |
sed -n '10,20p' big.log |
큰 파일의 일부만 확인 |
d 는 주소에 걸린 줄을 삭제하고 나머지를 출력합니다. p 와 반대로 "지울 줄"을 지정합니다.
sed '1d' file # 1번째 줄 삭제(헤더 제거에 자주 씀)
sed '/daegu/d' file # 패턴이 든 줄 삭제s/패턴/바꿀값/플래그 가 기본형입니다. 플래그로 범위를 조절합니다.
| 플래그 | 의미 |
|---|---|
| (없음) | 줄마다 첫 번째 일치만 |
g |
줄마다 모든 일치 |
2 |
줄마다 두 번째 일치만 |
i |
대소문자 구분 안 함 |
구분자 / 가 경로와 겹치면 \|, # 등 다른 문자로 바꿉니다.
sed 's|/opt/app|/srv/app|' file # / 대신 | 구분자-i 는 결과를 화면 대신 파일에 바로 씁니다. -i.bak 은 수정 전 파일을 .bak 으로 남깁니다.
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, 붙이지 않으면 오류).
-e 를 여러 번 쓰면 한 명령으로 여러 치환을 순서대로 적용합니다. a(append) 는 줄 뒤, i(insert) 는 줄 앞에 새 줄을 넣고, c(change) 는 줄 전체를 바꿉니다.
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-E(확장 정규식)에서 ( ) 로 묶은 부분을 \1, \2 로 재사용합니다. 열 순서 바꾸기와 "키는 그대로 두고 값만 바꾸기" 에 씁니다.
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)은 그대로 남기고 = 뒤 값만 바꾸는 패턴은 설정 파일 자동화에서 자주 씁니다.
awk 는 한 줄을 공백으로 나눠 $1, $2 ... 로 다룹니다. $0 은 줄 전체, $NF 는 마지막 필드입니다.
| 요소 | 의미 |
|---|---|
$1 $2 |
첫 번째·두 번째 필드 |
$NF |
마지막 필드 |
$0 |
줄 전체 |
-F',' |
구분자를 콤마로 지정 |
NR |
현재까지 읽은 줄 번호 |
NF |
현재 줄의 필드 개수 |
패턴 없이 {} 만 쓰면 조건 자리에 식을 넣어 필터로 씁니다. BEGIN 은 처리 전, END 는 처리 후 한 번만 실행됩니다.
awk 'BEGIN{print "start"} $9 > 200 {print $6, $9} END{print "done"}' access.log누적 변수는 선언 없이 바로 씁니다. 배열 a[키]+=값 으로 그룹별 합계를 구하고, printf 로 자리 맞춰 출력합니다.
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.csvfor (키 in 배열) 순서는 정해져 있지 않아 결과를 sort 로 정리하는 편이 안전합니다.
문자열 함수와 필드 출력 순서 바꾸기는 자주 같이 씁니다.
| 함수/표현 | 의미 |
|---|---|
length($1) substr($1,1,2) |
첫 필드 길이, 1~2번째 글자 |
print $3,$1,$2 |
필드 순서를 바꿔 출력 |
awk 로 값을 뽑고 sed 로 다듬은 뒤 sort | uniq -c | sort -rn 을 붙이면 즉석 집계표가 됩니다. tee 로 화면과 파일에 동시에 남깁니다.
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 를 씁니다.