LINUX
[16] 리눅스 - awk란?
혀내
2022. 6. 21. 13:40
반응형
awk란 리눅스에서 사용하는 스크립트 언어로, 만든 개발자들의 이름 앞 글자를 따 이름을 지었다고 한다.
(Aho, Weinberger, Kernighan)
awk 프로그램
간단한 건 직접 입력해 수행할 수 있지만, 보통은 프로그램 파일로 작성해 -f 옵션으로 수행한다.
시스템은 텍스트 파일에서 각 줄(line)을 필드로 구분하고, 각 line마다 awk 프로그램이 지시하는 대로 처리한다.
$ awk 프로그램 파일*
$ awk -f 프로그램파일 파일*
awk 프로그램의 구성
[ 조건 ] [ { 액션 } ]
→ 입력받은 파일에서 각 줄(line)을 스캔한 뒤, 만약 조건을 만족한다면 그 줄에서 액션을 수행합니다.
awk 시스템 변수
- FILENAME : 현재 처리 중인 입력 파일의 이름
- NR : 현재 레코드(line)의 번호
- NF : 현재 레코드의 필드 개수
- $1 : 첫 번째 필드
- $NF : 마지막 필드
- $0 : 한 줄 전체
조건
조건문의 종류
- BEGIN : 파일의 시작
- END : 파일의 끝
- 관계 연산자, 논리 연산자를 포함한 조건식
- /패턴/ : 패턴에 해당하는 줄
- 패턴1, 패턴2 : 패턴1을 포함한 줄부터 패턴2를 포함한 줄까지
액션
액션에 들어가는 실행문들
- if (조건) 실행문 [else 실행문]
- while(조건) 실행문
- for( 식; 조건; 식) 실행문
- break
- continue
- 변수 = 식
- print [식들의 리스트]
- printf 포맷 [, 식들의 리스트]
- next : 현재 줄에 대한 나머지 패턴들을 건너뜀
- exit : 현재 줄의 나머지 부분들을 건너뜀
- { 실행문 리스트 }
간단한 awk 프로그램의 예시)
# you.txt의 2번째 줄과 3번째 줄에서 '현재 줄 번호, 첫 번째 필드, 세 번째 필드, 마지막 필드'를 출력한다.
$ awk `NR > 1 && NR < 4 { print NR, $1, $3, $NF }` you.txt
# you.txt 파일의 끝에서 현재 줄 번호를 출력한다.
$ awk `END { print NR } ` you.txt
awk 프로그램의 예시)
# 매 줄마다 첫 번째 필드와 마지막 필드를 출력하는 프로그램
BEGIN { print "파일 시작:", FILENAME } # BEGIN { 액션 } : 입력을 읽기 전에 주어진 '액션'을 먼저 실행
{ print $1, $NF } # { 액션 } : 매 줄을 읽을 때마다 '동작' 실행
END { print "파일 끝" } # END { 액션 } : 마지막에 주어진 '액션' 실행
# 각 줄마다 첫 번째 필드를 3번, 5번, 7번 ... , NF번 씩 출력하는 프로그램
{
for (i = 3; i <= NF; i += 2)
printf"%s", $1
printf "\n"
}
# st로 시작해 한 자리 이상의 다른 문자가 존재하고 e로 끝나는 문자열(패턴)이 있으면, 줄의 전체 내용을 출력하는 프로그램
/st.*e/{print $0}
BEGIN{
FS="[^a-zA-Z]+" # FS : 필드 구분 변수, + : 1번 이상 (즉, 필드를 영어가 아닌 문자열을 기준으로 구분한다)
}
{
for (i=1; i<=NF; i++)
words[tolower($i)]++ # words 배열에 각 필드를 소문자로 변환해 저장한다.
}
END {
for (w in words) # 소문자로 저장된 문자열들을 불러와
print w, word[w] # 출력한다.
}
반응형