| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 |
- 심볼릭링크
- printworkingdirectory
- remove
- 권한상승
- Linux
- xargs
- command
- IT
- CodeBlock
- kill
- pkill
- 절대경로
- Tux
- 상대경로
- 하드링크
- 커널패닉
- df
- 리눅스
- pwd
- su
- du
- mkdir
- sed
- 명령어
- 턱스
- 텍스트
- scp
- 스트림에디터
- 코드블럭
- chown
- Today
- Total
Snow flake
[command] awk, sed 명령어 본문
grep으로 원하는 줄을 찾아낼 수 있다면, awk와 sed는 그 줄의 내용을 원하는 형태로 가공하거나 바꿔주는 명령어입니다. crontab으로 자동화한 스크립트 안에서 로그를 파싱하거나, 특정 값만 뽑아내거나, 텍스트를 일괄 치환할 때 정말 자주 쓰이는 조합입니다.
awk (텍스트 필드 추출/가공)
awk는 텍스트를 줄 단위, 그리고 그 줄 안에서 다시 필드(컬럼) 단위로 나눠서 원하는 부분만 뽑아내거나 가공하는 명령어입니다. 기본적으로 공백을 기준으로 필드를 구분합니다.
# 사용법
awk '조건 {실행할 동작}' 파일명
# ps -ef 결과에서 두 번째 컬럼(PID)만 추출
ps -ef | grep oracle | awk '{print $2}'
# 특정 필드만 여러 개 추출 (사용자명과 PID)
ps -ef | grep oracle | awk '{print $1, $2}'
$1, $2는 각각 첫 번째, 두 번째 필드를 의미합니다. ps -ef | grep oracle까지는 grep 글에서 다뤘던 패턴이고, 여기에 awk를 붙이면 원하는 컬럼(PID 등)만 뽑아낼 수 있습니다.
awk 구분자 지정하기
awk는 기본적으로 공백으로 필드를 나누지만, -F 옵션으로 다른 구분자를 지정할 수 있습니다. 예를 들어 /etc/passwd처럼 콜론(:)으로 구분된 파일을 다룰 때 유용합니다.
# -F : 필드 구분자를 콜론(:)으로 지정
# /etc/passwd에서 사용자명(1번째 필드)만 추출
awk -F: '{print $1}' /etc/passwd
# 콤마로 구분된 CSV 형태 로그에서 특정 필드만 추출
awk -F, '{print $3}' access.csv
awk로 조건에 맞는 줄만 처리하기
# 특정 값보다 큰 필드가 있는 줄만 출력
df -h | awk '$5+0 > 80 {print $1, $5}'
# 특정 문자열이 포함된 줄만 출력 (grep과 비슷하지만 필드 가공까지 함께 가능)
awk '/ERROR/ {print $1, $NF}' app.log
df 글에서 다뤘던 df -h 결과에서 사용률(Use%)이 80%를 넘는 파티션만 골라내는 예시입니다. $NF는 "마지막 필드"를 의미하는 awk의 특수 변수입니다. grep은 조건에 맞는 줄 전체를 보여주는 반면, awk는 그 줄에서 원하는 부분만 뽑아 가공까지 할 수 있다는 점이 차이입니다.
sed (텍스트 치환/편집)
sed는 Stream Editor의 약자로, 파일이나 입력값의 텍스트를 찾아서 바꾸거나 특정 줄을 삭제/추가하는 명령어입니다. vi처럼 파일을 열어서 편집하는 게 아니라, 명령어 한 줄로 텍스트를 일괄 처리한다는 점이 특징입니다.
# 사용법
sed '조건' 파일명
# 파일 내용 중 특정 문자열을 다른 문자열로 치환 (화면에만 출력, 파일은 안 바뀜)
sed 's/oracle/ORACLE/' config.txt
# 파일 자체를 직접 수정 (-i 옵션)
sed -i 's/oracle/ORACLE/' config.txt
# 줄 안에서 첫 번째로 매칭된 것만 아니라 전부 치환 (g: global)
sed -i 's/oracle/ORACLE/g' config.txt
s/찾을문자열/바꿀문자열/이 sed의 기본 치환 형식입니다. -i 옵션 없이 실행하면 화면에만 결과가 출력되고 원본 파일은 그대로 남아있으며, -i를 붙이면 파일 자체가 직접 수정됩니다. 뒤에 g를 붙이지 않으면 한 줄에 매칭되는 첫 번째 것만 바뀌고, g를 붙이면 그 줄에 있는 모든 매칭 항목이 바뀝니다.
sed로 특정 줄 삭제/추출하기
# 특정 줄 번호 삭제 (5번째 줄 삭제)
sed '5d' file.txt
# 특정 문자열이 포함된 줄 삭제
sed '/DEBUG/d' app.log
# 특정 줄 범위만 출력 (10번째~20번째 줄)
sed -n '10,20p' app.log
d는 삭제(delete), p는 출력(print)을 의미합니다. -n 옵션과 p를 함께 쓰면 지정한 조건에 맞는 줄만 출력하고 나머지는 숨길 수 있습니다.
awk와 sed, 언제 뭘 써야 할까
특정 컬럼(필드)만 뽑아내거나 계산해야 할 때 → awk
텍스트를 찾아서 바꾸거나, 특정 줄을 삭제/추출해야 할 때 → sed
간단히 말하면 awk는 "표 형태 데이터에서 원하는 열을 다루는 도구", sed는 "텍스트를 찾아 바꾸는 도구"에 가깝습니다.
실무에서 자주 마주치는 상황
crontab으로 자동화한 로그 모니터링 스크립트에서, awk와 sed가 실제로 어떻게 쓰이는지 보겠습니다.
# 1단계: 로그에서 ERROR가 포함된 줄만 확인 (grep)
grep ERROR /var/log/app/app.log
# 2단계: ERROR 줄에서 시간과 에러 내용만 추출 (awk)
grep ERROR app.log | awk '{print $1, $2, $NF}'
# 3단계: 오래된 설정값을 새 값으로 일괄 치환 (sed)
sed -i 's/OLD_DB_HOST/NEW_DB_HOST/g' /home/oracle/scripts/connect.conf
# 4단계: 특정 사용자의 프로세스 중 CPU 사용량이 높은 것만 추출 (ps + awk)
ps -ef | grep oracle | awk '{print $2, $3}'
grep으로 원하는 줄을 찾고, awk로 필요한 값만 뽑아내고, sed로 설정 파일을 일괄 수정하는 흐름은 로그 분석과 서버 설정 관리에서 계속 반복되는 패턴입니다. 세 명령어를 각각 따로 익히는 것보다, 이렇게 파이프라인으로 연결해서 쓰는 방식에 익숙해지면 실무 스크립트 작성 속도가 크게 달라집니다.
'Programming > Linux' 카테고리의 다른 글
| [command] top 명령어 (0) | 2026.09.21 |
|---|---|
| [command] ln 명령어 (0) | 2026.09.20 |
| [command] scp, rsync 명령어 (0) | 2026.09.15 |
| [command] tar, gzip 명령어 (1) | 2026.09.13 |
| [command] df, du 명령어 (0) | 2026.09.12 |
