0Pricing
DevOps Bootcamp · 강의

패턴, 범위 및 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 }' file

BEGIN에서 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 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. awk의 레코드, 필드 및 사용자 지정 구분자
  2. 패턴, 범위 및 BEGIN/END 블록
  3. awk 배열과 그룹화를 활용한 집계
  4. awk 함수, printf 서식 지정 및 보고서 생성
← DevOps Bootcamp(으)로 돌아가기