sed · awk 한 줄 처리 (치환·필드·집계)
5. 자주 하는 실수 (Tip)
❌ 실수 1: g 를 빠뜨려 한 곳만 바뀜
sed 's/a/b/' 는 줄마다 첫 번째 일치만 바꿉니다. 한 줄에 여러 번 나오는 값을 전부 바꾸려면 g 플래그가 꼭 필요합니다. 결과를 확인하지 않고 다음 단계로 넘어가면 나머지가 그대로 남습니다.
❌ 실수 2: -i 없이 실행해놓고 원본이 안 바뀌었다고 착각
sed 's/.../.../' 만 실행하면 화면에만 출력되고 파일은 그대로입니다. 파일을 실제로 바꾸려면 -i 를 붙여야 합니다. 화면 출력과 파일 수정은 별개입니다.
❌ 실수 3: BSD sed 와 GNU sed 의 -i 차이
macOS 기본 sed(BSD) 는 -i 뒤에 확장자를 꼭 붙여야 하고, 안 붙이면 오류가 납니다. Git Bash·리눅스의 GNU sed 는 확장자 없이 -i 만 써도 됩니다. 스크립트를 macOS 로 옮길 때 이 차이만 기억하면 됩니다.
❌ 실수 4: -F 없이 콤마 파일을 공백 기준으로 자름
awk 기본 구분자는 공백입니다. csv 파일에 -F',' 를 빠뜨리면 줄 전체가 $1 하나로 들어갑니다. 구분자가 다른 파일은 항상 -F 를 먼저 확인합니다.
❌ 실수 5: $0 과 $NF 를 혼동
$0 은 줄 전체, $NF 는 마지막 필드입니다. 줄마다 필드 개수가 다르면 $NF 가 가리키는 값도 줄마다 달라집니다. 필드 수가 일정한지 먼저 NF 로 확인하는 편이 안전합니다.
❌ 실수 6: sed 와 awk 정규식 문법이 다름
sed 는 -E 없이는 기본 정규식(BRE), awk 는 항상 확장 정규식에 가까운 문법을 씁니다. 같은 패턴이 도구마다 다르게 동작할 수 있습니다. 정규식 문법 자체는 리눅스 명령어 요약 02 정규식 을 참고합니다.
❌ 실수 7: 경로 패턴에 / 구분자를 그대로 써서 깨짐
sed 's/\/opt\/app/\/srv\/app/' 처럼 / 를 이스케이프하면 읽기 어렵고 실수하기 쉽습니다. s|/opt/app|/srv/app| 처럼 구분자를 바꾸면 훨씬 깔끔합니다. 경로·URL 을 다룰 때는 구분자부터 바꾸는 습관을 들입니다.
❌ 실수 8: 배열 집계 결과 순서가 뒤섞임
for (키 in 배열) 의 순회 순서는 awk 구현마다 다르고 보장되지 않습니다. 정렬된 결과가 필요하면 출력 뒤에 | sort 를 붙입니다. 순서에 의존하는 로직을 배열 순회 안에 넣지 않습니다.
❌ 실수 9: 백업 없이 대량 치환
운영 설정 파일에 -i 로 바로 치환했다가 패턴이 잘못되면 되돌릴 방법이 없습니다. 중요한 파일은 항상 -i.bak 이나 사전 cp 로 백업을 남깁니다. 되돌릴 수 없는 명령일수록 먼저 화면 출력으로 결과를 확인합니다.
❌ 실수 10: 한 줄이면 되는 작업을 vi 로 수작업
파일 하나를 에디터로 열어 값을 찾아 바꾸는 작업은 반복 시 실수하기 쉽고 자동화도 안 됩니다. 같은 패턴이 여러 파일·여러 서버에 반복되면 sed·awk 한 줄로 옮기는 편이 빠르고 안전합니다. 스크립트로 남기면 다음에도 그대로 재사용됩니다.