반응형
리눅스 awk 명령어 사용법 정리
awk는 텍스트 기반 데이터를 패턴 매칭 + 필드 처리 + 연산을 통해 가공하는 강력한 CLI 도구입니다.
특히 로그 분석, 리포트 생성, 데이터 변환 작업에서 매우 유용합니다.
특징
- 필드 기반 처리 (column 처리)
- 정규식 지원
- 변수 / 조건문 / 반복문 지원
- C-like 문법
1. 기본 구조
awk [옵션] 'pattern { action }' file
또는
awk [옵션] -f script.awk file
레코드와 필드
- 레코드 (Record) : 한 줄 (기본: newline 기준)
- 필드 (Field) : 공백 기준으로 나뉜 값
패턴과 액션
pattern { action }
- pattern만 : 조건 만족 라인 출력
- action만 : 모든 라인에 적용
주요 옵션
-F (필드 구분자)
awk -F ':' '{print $1}' /etc/passwd
- : 기준으로 필드 분리
-v (변수 전달)
awk -v limit=100 '$2 > limit'
-f (스크립트 파일)
awk -f script.awk input.txt
BEGIN / END 블록
BEGIN { 초기화 }
{ 본 처리 }
END { 결과 출력 }
예제
awk 'BEGIN {sum=0} {sum+=$2} END {print sum}' file
2. 패턴 (조건)
정규식
/good/
$1 ~ /good/
$1 !~ /bad/
비교 연산
$2 > 100
NF == 4
복합 조건
NF == 4 && /^good/
3. 자주 사용하는 예제
특정 문자열 포함 라인
awk '/error/' logfile
특정 필드 출력
awk '{print $1, $3}'
조건 + 필드 출력
awk '$1 ~ /good/ {print $3, $2}'
카운트
awk '/good/ {count++} END {print count}'
합계 계산
awk '{sum += $2} END {print sum}'
짝수 라인 출력
awk 'NR % 2 == 0'
라인 수 출력
awk 'END {print NR}'
빈 줄 제거
awk 'NF > 0'
파일 크기 합계
ls -l | awk '{sum += $5} END {print sum}'
728x90
4. 실무 활용 예제 (중요)
로그 필터링 (응답 크기 기준)
awk '$6 > 4000' access.log
특정 IP 추출
awk '{for(i=1;i<=NF;i++) if($i ~ /dst=/) print $i}' file
특정 필드만 반복 출력
awk '{for(i=1;i<NF;i++) print $i}'
CSV 처리
awk -F ',' '{print $1, $3}' file.csv
주요 내장 변수
- FS 입력 필드 구분자
- OFS 출력 필드 구분자
- RS 레코드 구분자
- ORS 출력 레코드 구분자
- NF 필드 개수
- NR 전체 레코드 번호
- FNR 파일별 레코드 번호
- FILENAME 파일 이름
문자열 함수
- length(s) 길이
- index(s1,s2) 위치
- substr(s,m,n) 부분 문자열
- split(s,arr,sep) 배열 분리
- gsub(r,s) 전체 치환
- sub(r,s) 첫 번째 치환
- tolower() 소문자
- toupper() 대문자
- 11. 수치 함수
- int(x) 정수 변환
- sqrt(x) 제곱근
- rand() 난수
- srand() 난수 초기화
입출력/제어
- print 출력
- printf 포맷 출력
- getline 다음 라인 읽기
- next 다음 레코드
- system() 쉘 명령 실행
5. 제어문
if (조건) { }
else { }
for (i=1; i<=NF; i++) { }
while (조건) { }
6. 고급 팁
레코드/필드 구분 변경
BEGIN {
FS = "\n"
RS = ""
}
- 빈 줄 기준 레코드 분리
포맷 출력
awk '{printf "%-10s %5d\n", $1, $2}'
난수 생성
awk 'BEGIN {srand(); for(i=1;i<=7;i++) print int(100*rand())}'
7. awk vs sed vs grep
- grep 검색
- sed 치환
- awk 분석 + 연산
로그에서 특정 필드(예: 응답 크기)가 4000 이상인 행 필터링
awk '{ if ($6+0 > 4000) print }' access_log.2014-01-02-05.log
awk -F'dst=' '{if(NF>1) print $2}' messages
또는
awk '{
for(i=1;i<=NF;i++) {
if($i ~ /dst=168.126.63.1/)
print $i
}
}' messages
728x90
반응형
'리눅스' 카테고리의 다른 글
| 리눅스 rdate 명령어 사용법 정리 (1) | 2020.09.04 |
|---|---|
| CentOS 7에서 yum update를 실행할 때 kernel 패키지를 제외하는 방법 (0) | 2020.09.04 |
| MySQL mysqlshow 명령어 (0) | 2020.09.04 |
| dig 명령어 (0) | 2020.09.04 |
| ping, telnet으로 통신 상태 확인 (0) | 2020.09.04 |