한 명령 속의 작은 언어
awk는 입력을 줄 단위로 읽으며 pattern { action } 규칙을 실행해. 패턴이 적용할 줄을 고르고, 중괄호 안의 동작이 그 줄을 출력하거나 계산해.
필드 변수
기본 설정에서는 각 줄을 공백 기준으로 나눠 $1, $2부터 마지막 필드인 $NF까지 제공해. NF는 필드 수, NR는 현재 줄 번호, $0는 줄 전체를 뜻해.
일을 하는 예시
awk '{print $1}': 각 줄의 첫 필드.awk '{print $NF}': 마지막 필드.awk -F: '{print $1}' /etc/passwd: 콜론 구분자.awk '/error/ {print NR, $0}': 'error' 포함 줄의 줄번호 + 내용.awk 'NR==5': 5번째 줄만.awk '{sum += $3} END {print sum}': 3번째 컬럼 합.awk 'length($0) > 100': 100 글자 넘는 줄.
BEGIN / END 블록
BEGIN { ... }는 입력 전 한 번. END { ... }는 끝나고 한 번. 헤더를 만들거나 합계와 평균을 계산할 때 써.
awk 'BEGIN {print "size,name"} {print $5","$9}' <(ls -l)이 예시는 CSV 헤더와 파일별 크기·이름을 출력하므로 결과를 sort 같은 다음 단계로 넘길 수 있어.
왜 awk가 sed 위에
sed는 텍스트 치환에 강하고, awk는 산술과 필드 조작에 강해. 값을 세거나 필드를 합산하고 숫자 조건으로 거를 때는 awk가 더 잘 맞아.
필드 번호는 입력 형식의 가정이야
$1, $2가 무엇인지 말하려면 구분자, 빈 필드, 앞쪽 공백 규칙이 먼저 정해져야 해. 공백 하나로 보이는 로그도 따옴표와 값 안의 공백이 있으면 단순 필드가 아니야. 표본 몇 줄이 아니라 형식 계약을 확인해.
awk의 숫자 변환은 편하면서 위험해
문자열이 산술 문맥에서 자동으로 숫자로 바뀌면 잘못된 값이 0처럼 처리될 수 있어. 임계값 판단이나 금액 계산에서는 입력이 숫자 형식인지 먼저 검사하고 로케일의 decimal 표기도 고정해.