티스토리 뷰
1. awk란 무엇인가요?
awk는 Aho, Weinberger, Kernighan 세 사람의 성을 따서 만든 이름으로, 텍스트 파일에서 패턴을 검색하고 그에 따른 작업을 수행하는 스크립트 언어이자 명령어입니다. 주로 데이터 처리와 보고서 생성에 사용되며, 다음과 같은 특징을 갖고 있습니다:
패턴 매칭: 정규 표현식을 사용하여 원하는 텍스트를 손쉽게 찾을 수 있습니다.
필드와 레코드 개념: 텍스트를 필드(열)와 레코드(행)로 분할하여 구조화된 데이터처럼 다룰 수 있습니다.
프로그램 가능성: 변수, 배열, 함수, 조건문, 반복문 등 프로그래밍 기능을 제공합니다.
유연성: 간단한 명령에서 복잡한 스크립트까지 다양하게 활용할 수 있습니다.
2. awk의 기본 구문
awk '패턴 { 동작 }' 파일명
패턴: 검사할 조건식 또는 정규 표현식입니다.
동작: 패턴에 매칭되는 레코드에 대해 수행할 명령어 블록입니다.
파일명: 대상이 되는 텍스트 파일입니다.
예를 들어:
awk '/error/ { print $0 }' logfile.txt
logfile.txt에서 'error'라는 단어가 포함된 줄을 찾아 출력합니다.
3. 주요 개념
3.1. 레코드와 필드
레코드(Record): 기본적으로 한 줄의 텍스트를 의미하며, 줄바꿈 문자(\n)로 구분됩니다.
필드(Field): 한 레코드 내에서 필드 구분자(FS)로 분리된 각 부분을 의미합니다. 기본 구분자는 공백(Space)입니다.
$1, $2, ..., $NF: 각각 첫 번째 필드, 두 번째 필드, ..., 마지막 필드를 나타냅니다.
$0: 전체 레코드를 의미합니다.
3.2. 내장 변수
| 변수 | 설명 |
|---|---|
| $0 | 현재 레코드 전체 |
| $1, $2 | 각 필드의 값 |
| FS | 필드 구분자(Field Separator), 기본값은 공백 |
| RS | 레코드 구분자(Record Separator), 기본값은 줄바꿈 |
| NF | 현재 레코드의 필드 개수 |
| NR | 현재까지 처리한 총 레코드 수 |
| FNR | 현재 파일에서 처리한 레코드 수 |
| OFS | 출력 필드 구분자(Output Field Separator) |
| ORS | 출력 레코드 구분자(Output Record Separator) |
4. awk의 기본 사용법
4.1. 모든 레코드 처리
파일의 모든 줄에 대해 동작을 수행합니다.
awk '{ print $0 }' filename
4.2. 특정 패턴에 매칭되는 레코드 처리
awk '/pattern/ { print $0 }' filename
'pattern'에 매칭되는 레코드에만 동작을 수행합니다.
5. 실용적인 예제
예제 1: 특정 필드 출력하기
파일 내용(data.txt):
Alice 30 Developer
Bob 25 Designer
Charlie 35 Manager
- 첫 번째와 두 번째 필드를 출력하기:
awk '{ print $1, $2 }' data.txt
- 결과:
Alice 30
Bob 25
Charlie 35
예제 2: 조건에 따른 출력
- 나이가 30 이상인 사람의 정보 출력:
awk '$2 >= 30 { print $0 }' data.txt
- 결과:
Alice 30 Developer
Charlie 35 Manager
예제 3: 필드 구분자 변경하기
CSV 파일(data.csv):
Name,Age,Role
Alice,30,Developer
Bob,25,Designer
Charlie,35,Manager
- 필드 구분자를 콤마로 지정하고, 이름과 역할 출력:
awk -F',' '{ print $1, $3 }' data.csv
- 결과:
Name Role Alice Developer Bob Designer Charlie Manager
예제 4: 패턴 매칭
- 'Developer' 역할을 가진 사람만 출력:
awk '/Developer/ { print $0 }' data.txt
- 결과:
Alice 30 Developer
6. 수학 연산 및 변수 사용
예제 5: 합계와 평균 계산
점수 파일(scores.txt):
Subject Score
Math 90
Science 80
English 85
- 점수의 총합과 평균 계산:
awk 'NR > 1 { total += $2 } END { print "Total:", total; print "Average:", total/(NR-1) }' scores.txt
- 결과:
Total: 255
Average: 85
| 명령 | 설명 |
|---|---|
| NR > 1 | 첫 번째 줄(헤더)을 제외하고 연산합니다. |
| total += $2 | 두 번째 필드(점수)를 누적합니다. |
| END | 모든 레코드를 처리한 후 결과를 출력합니다. |
7. 제어 구조 사용
예제 6: 조건문(if) 사용
- 나이에 따라 성인 여부 판별:
awk '{ if ($2 >= 20) status="Adult"; else status="Minor"; print $1, status }' data.txt
- 결과:
Alice Adult
Bob Adult
Charlie Adult
예제 7: 반복문(for) 사용
- 한 사람의 모든 점수 합계 구하기:
학생 점수 파일(students.txt):
Name Math Science English
Alice 90 80 85
Bob 75 85 80
Charlie 95 90 100
- 각 학생의 총점과 평균 계산:
awk 'NR > 1 {
total = 0;
for (i = 2; i <= NF; i++) {
total += $i;
}
avg = total / (NF - 1);
print $1, "Total:", total, "Average:", avg
}' students.txt
- 결과:
Alice Total: 255 Average: 85
Bob Total: 240 Average: 80
Charlie Total: 285 Average: 95
8. 내장 함수 활용
예제 8: 문자열 함수
- 문자 개수 세기:
awk '{ print $1, "Length:", length($1) }' data.txt
- 결과:
Alice Length: 5
Bob Length: 3
Charlie Length: 7
| 함수 | 설명 |
|---|---|
| length(string) | 문자열의 길이를 반환합니다. |
예제 9: 수학 함수
- 로그 계산:
echo "Number 1000" | awk '{ print $1, $2, "Log:", log($2) }'
결과:
Number 1000 Log: 6.90776
| 함수 | 설명 |
|---|---|
| log(number) | 자연 로그 값을 반환합니다. |
9. BEGIN과 END 블록
| 키워드 | 설명 |
|---|---|
| BEGIN | 파일을 읽기 전에 한 번 실행됩니다. |
| END | 모든 처리가 끝난 후 한 번 실행됩니다. |
예제 10: 헤더와 푸터 추가
awk 'BEGIN { print "Report Start" } { print $0 } END { print "Report End" }' data.txt
- 결과:
Report Start
Alice 30 Developer
Bob 25 Designer
Charlie 35 Manager
Report End
10. 외부 변수와 함께 사용
예제 11: 쉘 변수 전달
threshold=30
awk -v age="$threshold" '$2 >= age { print $1, $2 }' data.txt
- 결과:
Alice 30
Charlie 35
| 명령 | 설명 |
|---|---|
| -v 변수명=값 | awk 스크립트 내에서 변수 사용이 가능합니다. |
11. 스크립트 파일로 작성하기
복잡한 awk 스크립트는 별도의 파일로 저장하여 실행할 수 있습니다.
예제 12: 스크립트 파일 생성
script.awk 내용:
#!/usr/bin/awk -f
BEGIN {
FS=" "
print "Name\tAge\tRole"
print "------------------------"
}
{
if (NR > 1) {
printf "%s\t%d\t%s\n", $1, $2, $3
}
}
END {
print "------------------------"
print "Total Records:", NR - 1
}
- 실행 방법:
chmod +x script.awk
./script.awk data.txt
- 결과:
Name Age Role
------------------------
Alice 30 Developer
Bob 25 Designer
Charlie 35 Manager
------------------------
Total Records: 3
12. 고급 기능
12.1. 배열과 연관 배열
awk는 배열과 연관 배열(해시 테이블)을 지원합니다.
예제 13: 단어 개수 세기
awk '{ for (i = 1; i <= NF; i++) word[$i]++ } END { for (w in word) print w, word[w] }' text.txt
| 명령 | 설명 |
|---|---|
| word[$i]++ | 각 단어를 키로 하여 빈도수를 셉니다. |
12.2. 서브셸 호출
외부 명령이나 서브셸을 호출할 수 있습니다.
예제 14: 시스템 명령 실행
awk 'BEGIN { "date" | getline d; print "Current Date:", d }'
| 명령 | 설명 |
|---|---|
| "명령어" | getline 변수 | 명령어의 출력을 변수에 저장합니다. |
13. 실제 활용 예시
13.1. 로그 파일 분석
예제 15: 특정 기간의 로그 추출
awk '/2023-10-11 10:/ { print $0 }' system.log
| 명령 | 설명 |
|---|---|
| /2023-10-11 10:/ | 2023년 10월 11일 10시의 로그를 추출합니다. |
13.2. 데이터 변환
예제 16: 대문자로 변환
awk '{ print toupper($0) }' lowercase.txt
| 명령 | 설명 |
|---|---|
| toupper(string) | 문자열을 대문자로 변환합니다. |
- Total
- Today
- Yesterday
- 무료도메인 duckdns
- 자체 서명 인증서 만들기
- nexus 도커 저장소 구축
- k8s cluster
- nginx https letsencrypt
- dockershim oci cri
- vagrant install
- docker-compose 사용법
- vagrant virtualbox
- ssl 인증서 만들기
- kubernetes taint
- 도커 저장소
- nodeport service kubernetes
- service nodeport
- letencrypt ssl 인증서
- private docker registry 구축
- 사설인증서 nginx에 설정
- docker compose install
- k8s service
- k8s 설치
- vagrant 설치
- kubernetes endpoint
- vagrant kubernetws install
- nginx https
- calico 설치
- nexus docker 저장소 구축
- duckdns letsencrypt 인증서
- 무료인증서 letsencrypt
- vagrant kubernetes install
- duckdns letsencrypt
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |