패턴, 범위 및 BEGIN/END 블록
조건부 패턴으로 레코드를 필터링하고 BEGIN 및 END 블록을 사용하여 헤더와 합계를 생성합니다.
패턴, 범위 및 BEGIN/END 블록은(는) CoddyKit의 무료 DevOps Bootcamp 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 DevOps Bootcamp 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. DevOps Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.
awk 패턴이란 무엇인가요
awk에서 패턴은 주어진 입력 줄에 대해 작업 블록을 실행할지 결정하는 조건입니다. 일반적인 형식은 다음과 같습니다.
awk 'pattern { action }' file패턴이 현재 레코드와 일치하면 작업이 실행됩니다. 작업을 지정하지 않으면 awk는 기본적으로 줄 전체를 출력합니다. 패턴에는 다음과 같은 유형이 있습니다.
- 정규 표현식 —
/regex/ - 관계식 —
$3 > 100 - 복합식 —
$1 == "ERROR" && $4 > 500 - 범위 패턴 —
/start/,/end/ - 특수 패턴 —
BEGIN및END
패턴을 이해하면 단순히 열을 출력하는 도구가 아니라 강력한 데이터 필터로 awk를 활용할 수 있습니다.
정규식 패턴으로 줄 필터링하기
가장 일반적인 패턴 유형은 슬래시로 감싼 정규 표현식입니다. awk는 각 줄을 정규식과 비교하고, 일치하는 경우에만 작업을 실행합니다.
아래에서는 /var/log/syslog 형식의 파일을 필터링하여 ERROR라는 단어가 포함된 줄만 표시합니다.
#!/usr/bin/env bash
# Simulate a log file and filter ERROR lines
log=$(cat <<'EOF'
2026-06-11 08:01:22 INFO service started
2026-06-11 08:02:05 ERROR disk quota exceeded on /dev/sda1
2026-06-11 08:02:44 WARN memory usage at 80%
2026-06-11 08:03:10 ERROR connection timeout to 10.0.0.5
2026-06-11 08:03:55 INFO backup completed
EOF
)
echo "=== ERROR lines only ==="
echo "$log" | awk '/ERROR/ { print NR": "$0 }'부정 패턴과 복합 패턴
정규식 패턴 앞에 !를 붙이면 조건을 반전하여 해당 패턴을 포함하지 않는 줄과 일치시킬 수 있습니다. 세밀하게 제어하려면 여러 조건을 &&(AND) 또는 ||(OR)로 결합하십시오.
!/DEBUG/— DEBUG 줄 건너뛰기$3 > 500 && $5 == "POST"— 큰 POST 요청/WARN/ || /ERROR/— 두 심각도 중 하나
아래 예제에서는 단순화한 액세스 로그를 구문 분석하여 응답 크기가 1000바이트를 초과하는 POST 요청만 출력합니다.
#!/usr/bin/env bash
access=$(cat <<'EOF'
10.0.0.1 GET /api/ping 200 48
10.0.0.2 POST /api/upload 201 2048
10.0.0.3 GET /api/users 200 512
10.0.0.4 POST /api/data 200 3500
10.0.0.5 POST /api/health 200 60
EOF
)
echo "Large POST requests (>1000 bytes):"
echo "$access" | awk '$2 == "POST" && $5 > 1000 { print $1, $3, "size="$5 }'범위 패턴: /start/,/end/
범위 패턴은 연속된 레코드 블록을 선택합니다. /start/와 일치하는 줄부터 /end/와 일치하는 줄까지 양 끝을 포함하여 선택합니다. 구문은 다음과 같습니다.
awk '/start/,/end/ { action }' file다음과 같은 동작을 알아 두십시오.
/start/와 일치하는 첫 줄에서 범위가 활성화되고, 그 뒤에 나오는/end/와 일치하는 첫 줄 다음에 비활성화됩니다./end/가 한 번도 일치하지 않으면 범위는 EOF까지 활성 상태로 유지됩니다.- 하나의 파일에 겹치지 않는 범위가 여러 개 있으면 각각 독립적으로 처리됩니다.
따라서 범위 패턴은 구성 파일에서 표시된 섹션을 추출하거나, 구분자 머리글이 있는 로그 또는 여러 블록으로 구성된 보고서를 추출하는 데 적합합니다.
범위 패턴으로 섹션 추출하기
여러 이름이 지정된 섹션이 [section] 머리글로 구분되어 있는 서버 구성 파일을 생각해 보십시오. 여기서 [database] 내부의 줄만 추출하려고 합니다.
#!/usr/bin/env bash
config=$(cat <<'EOF'
[server]
host = 0.0.0.0
port = 8080
[database]
host = 127.0.0.1
port = 5432
name = appdb
user = admin
[cache]
host = 127.0.0.1
port = 6379
EOF
)
echo "=== [database] section ==="
echo "$config" | awk '/\[database\]/,/^\[/' \
| awk 'NR > 1 && !/^\[/ && NF'BEGIN 블록
BEGIN 블록은 입력을 읽기 전에 한 번 실행됩니다. 다음과 같은 작업에 적합합니다.
- 보고서 머리글 출력
- 변수와 카운터 초기화
- 필드 구분자(
FS) 또는 기타 내장 변수 설정 - 입력이 필요 없는 독립 실행형
awk프로그램 실행
구문:
awk 'BEGIN { setup } pattern { action }' fileBEGIN에서 FS를 설정하는 방식은 -F 플래그를 사용하는 것보다 깔끔한 대안입니다. 특히 구분자 관련 로직을 스크립트 내부에 두는 여러 규칙의 프로그램을 작성할 때 유용합니다.
#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)
echo "$csv" | awk 'BEGIN {
FS = ","
printf "%-10s %-15s %10s\n", "Name", "Department", "Salary"
print "--------------------------------------------"
}'END 블록
END 블록은 마지막 레코드가 처리된 후 한 번 실행됩니다. 다음과 같은 작업을 수행하기에 적합합니다.
- 처리 중 누적한 합계, 평균 및 요약 출력
- 출력 파일 플러시 또는 닫기
- 서식이 지정된 보고서의 바닥글 출력
주요 규칙에서 설정한 변수는 END 내부에서도 여전히 범위 안에 있습니다. 이것이 누적 합계를 계산하는 방식입니다. 아래 예제에서는 CSV에서 급여 값을 합산하고 바닥글에 합계를 출력합니다.
#!/usr/bin/env bash
csv=$(cat <<'EOF'
alice,engineering,95000
bob,marketing,72000
carol,engineering,105000
dave,hr,68000
EOF
)
echo "$csv" | awk -F',' '
{ total += $3; count++ }
END { printf "Employees: %d Total payroll: $%d\n", count, total }
'BEGIN, 규칙, END 결합하기
세 블록을 모두 하나의 독립적인 awk 프로그램으로 결합하면 진정한 강력함이 드러납니다. 이 프로그램은 머리글을 출력하고, 각 레코드를 처리하고, 요약을 출력합니다. 이 패턴은 셸 기반 보고서 파이프라인의 핵심입니다.
아래는 웹 요청의 CSV를 읽어 줄마다 세부 정보를 출력하고, 1초를 초과한 요청의 최종 개수를 출력하는 완전한 보고서 생성기입니다.
#!/usr/bin/env bash
data=$(cat <<'EOF'
/api/ping,0.03
/api/users,1.45
/api/login,0.88
/api/upload,2.10
/api/health,0.02
/api/report,1.73
EOF
)
echo "$data" | awk -F',' '
BEGIN {
printf "%-20s %10s %s\n", "Endpoint", "Latency(s)", "Status"
print "--------------------------------------"
}
{
status = ($2 > 1.0) ? "SLOW" : "OK"
if (status == "SLOW") slow++
printf "%-20s %10s %s\n", $1, $2, status
}
END {
print "--------------------------------------"
printf "Slow requests: %d / %d\n", slow, NR
}
'BEGIN을 사용하여 OFS와 ORS 설정하기
자주 간과되지만 BEGIN에서 깔끔하게 설정할 수 있는 출력 변수 두 가지가 있습니다.
- OFS(출력 필드 구분자) —
$1=$1로 레코드를 다시 구성하거나print $1, $2를 사용할 때 필드 사이에 삽입됩니다. - ORS(출력 레코드 구분자) — 각
print호출 뒤에 추가됩니다(기본값은\n).
OFS=","로 설정하면 문자열을 이어 붙이지 않고도 한 번의 처리로 TSV를 CSV로 다시 형식화할 수 있습니다. ORS를 "\n---\n"로 변경하면 레코드 사이에 구분선이 자동으로 추가됩니다.
#!/usr/bin/env bash
# Convert whitespace-delimited data to CSV with a header
data=$(cat <<'EOF'
alice engineering 95000
bob marketing 72000
carol engineering 105000
EOF
)
echo "$data" | awk 'BEGIN { OFS=","; print "name,dept,salary" }
{ $1=$1; print }'실전 범위 패턴: 로그 사건 구간
범위 패턴은 운영 로그 분석에서 특히 유용합니다. 일반적인 작업은 INCIDENT START 및 INCIDENT END와 같은 표식 메시지로 식별되는 사건의 시작과 끝 사이에 있는 모든 로그 줄을 추출하는 것입니다.
아래 예제에서 awk는 사건 구간 내부의 줄만 추출하고, 그 안의 ERROR 이벤트 수를 계산합니다. 이 예제는 범위 패턴을 누적 변수 및 END 요약과 결합합니다.
#!/usr/bin/env bash
log=$(cat <<'EOF'
08:00:01 INFO Normal operation
08:01:00 INFO INCIDENT START: disk pressure detected
08:01:05 ERROR write failed on /dev/sda1
08:01:09 ERROR inode table corruption
08:01:14 WARN remounting read-only
08:01:22 INFO INCIDENT END: disk replaced
08:02:00 INFO Normal operation resumed
EOF
)
echo "$log" | awk '
/INCIDENT START/,/INCIDENT END/ {
print
if (/ERROR/) errors++
}
END { print "Errors during incident:", errors+0 }
'범위에서 구분자 줄 건너뛰기
기본적으로 범위 패턴에는 /start/ 및 /end/와 일치하는 줄 자체도 포함됩니다. 이러한 구분자 줄을 건너뛰고 그 사이의 내용만 유지하려면 부정 조건이나 플래그 변수를 사용하여 작업 실행을 제한하십시오.
- 부정 조건 방식:
/start/,/end/ { if (!/start/ && !/end/) print } - 플래그 방식:
/start/에서 변수를 1로,/end/에서 0으로 직접 설정합니다.
구분자 텍스트가 본문 내용에도 나타날 수 있다면 플래그 방식이 더 안정적입니다.
#!/usr/bin/env bash
doc=$(cat <<'EOF'
## preamble
some intro text
## BEGIN_REPORT
row1: alpha 100
row2: beta 200
row3: gamma 150
## END_REPORT
## appendix
EOF
)
echo "$doc" | awk '
/## BEGIN_REPORT/ { capture=1; next }
/## END_REPORT/ { capture=0 }
capture { print }
'지식 확인: BEGIN 블록 동작
awk에서 BEGIN 및 END 블록이 입력 처리와 어떻게 상호 작용하는지 이해했는지 확인해 보십시오.
단원 요약: 패턴, 범위, BEGIN/END
이 단원에서는 awk 프로그램의 가장 강력한 구조적 기능 세 가지를 익혔습니다.
- 패턴 — 정규식(
/ERROR/), 관계식($3 > 1000), 부정식(!/DEBUG/), 복합식(&&,||)으로, 명시적인if문 없이 어떤 레코드가 작업을 실행할지 제어합니다. - 범위 패턴(
/start/,/end/) — 연속된 레코드 블록을 선택하므로 로그 사건 구간, 구성 섹션 및 보고서 구간을 추출하는 데 적합합니다. 구분자 줄 자체를 제외해야 할 때는 플래그 변수(next+ 부울)를 사용하십시오. - BEGIN 블록 — 입력 전에 한 번 실행되며,
FS,OFS,ORS설정, 카운터 초기화, 보고서 머리글 출력에 적합합니다. - END 블록 — 모든 입력 후 한 번 실행되며, 주요 규칙에서 누적한 변수를 사용하여 합계, 평균 및 바닥글을 출력하기에 알맞은 위치입니다.
이 기능들을 함께 사용하면 원시 텍스트를 입력받아 구조화되고 사람이 읽기 쉬운 보고서를 출력하는, 완전하고 자체적으로 설명되는 awk 프로그램을 작성할 수 있습니다. 임시 파일이나 외부 도구 없이 단 하나의 파이프라인 단계에서 모두 처리할 수 있습니다.
자주 묻는 질문
“패턴, 범위 및 BEGIN/END 블록” 강의는 무료인가요?
네 — “패턴, 범위 및 BEGIN/END 블록” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 DevOps Bootcamp 강의 전체를 잠금 해제할 수 있습니다. DevOps Bootcamp 강의에는 총 4개의 강의가 포함되어 있습니다.
“패턴, 범위 및 BEGIN/END 블록”에서 뭘 배우나요?
조건부 패턴으로 레코드를 필터링하고 BEGIN 및 END 블록을 사용하여 헤더와 합계를 생성합니다. 브라우저에서 직접 실행하는 실습 코드로 DevOps Bootcamp을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
DevOps Bootcamp을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 DevOps Bootcamp은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“패턴, 범위 및 BEGIN/END 블록” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 DevOps Bootcamp 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 DevOps Bootcamp 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- awk의 레코드, 필드 및 사용자 지정 구분자
- 패턴, 범위 및 BEGIN/END 블록
- awk 배열과 그룹화를 활용한 집계
- awk 함수, printf 서식 지정 및 보고서 생성