awk
awk (오크)
- Aho Weinberger Kernighan이 만들었고 이니셜을 따서 이름을 지었다
- unix에서 개발된 스크립트 언어로 제작
- 텍스트가 저장되어 있는 파일을 원하는 대로 필터링 / 추가 / 가공해서 나온 결과를 행과 열로 출력해준다
기본 형식
1. 파일을 취급할 때
awk [option] 'pattern {action}' [file]
2. 다른 command의 결과를 취급할 때
command | awk [option] 'pattern {action}'
- ' ' : awk의 길이를 표시
- " " : 큰 따옴표 안은 함수가 아니라 문자
- $0 : record
- $1 : 첫번째 field
- pattern : 패턴이 없으면 전체 record를 가져오고, 패턴이 있으면 특정 record만 가져온다 (pattern 생략 시 전체 record 취급)
- action : print 함수 등으로 스크립트를 수행할 수 있다 (생략 시 기본 action인 print 실행)
-v option
awk -v [var]=[val] : 외부 변수를 awk 스크립트 내에서 사용할 수 있도록 전달
VAR=value
echo text | awk -v var=$VAR '{print $0, var}'
#결과
text value
-F option
awk -F[특수문자] {print $1} : 해당 특수문자로 값을 구분해서 처리
echo "file4~file5~ file6" | awk -F "~" '{print $1, $2, $3};
awk가 하는 일
- 출력
- 문자 추가
- 필터링
- 조건문
- 함수
내장 변수
- FILENAME : 현재 입력파일의 이름
- $0 : 입력 레코드
- $n : 입력 레코드의 N번째 필드
- ENVIRON : 환경변수를 모아둔 관계형 배열
- NR : 출력 순번
- NF : 현재 줄의 필드수
- ARGC : 명령줄 인자의 개수
- ARGV : 명령줄 인자들의 배열
- FNR : 현재파일에서의 레코드 번호
- FS : 입력 필드 구분자
- OFMT : 숫자들의 표현형식
- OFS : 출력필드 구분자
- ORS : 출력 레코드 구분자
- RS : 입력코드 구분자
- EP : 서브스크립트의 구분자
- RLENGTH : match 함수로 일치하는 문자열의 길이
- RSTART : match 함수로 일치하는 문자열의 오프셋
원본 데이터
1열 출력
awk '{print $1}' ./test.txt
1,3열 출력
awk '{print $1, $3} ./test.txt
문자를 포함한 record 출력
awk '/34/' ./test.txt
문자열과 함께 출력
awk '{print "1열은 ", $1, "입니다."}' ./test.txt
awk '{print ("name : " $1, "/ ", "phone : ", $2)}' ./test.txt
특정 record 검색해서 출력
(if 생략 가능)
awk '{if($5>=80) print ($0)}' ./test.txt
awk '$5>=80 {print $0}' test.txt
awk '{if($4=="M") print ($0)}' ./test.txt
awk '{if($4 == "M" && $5 >= 80) print $0}' ./test.txt
BEGIN / END
BEGIN : record를 처리하기 전에 BEGIN에 지정된 action을 먼저 수행
END : record를 모두 처리한 후에 END에 지정된 action을 수행
awk 'BEGIN {print "시작"} {print $1, $2} END {print "끝"} ' ./test.txt
참고
https://recipes4dev.tistory.com/171
https://reakwon.tistory.com/163#google_vignette