본문 바로가기

Infra Architecture/linux

[ Shell Script ] awk 명령어

반응형

BEGIN END문 패턴

awk '
 	BEGIN { actions } 
 	/pattern/ { actions }
 	/pattern/ { actions }
            ……….
	 END { actions } 
' filenames

 

Shell변수 awk로 전달

SHELL변수를 awk내부에서 사용하기 위해서는 -v 옵션을 사용하고 -v var=$var로 치환 후 사용한다.

pattern을 shell변수를 전달받아 사용시에는 shell변수에도 / /가 필요 없고 pattern사용시에도 / /없이 사용한다.

/ 앞에 \도 사용하면 안된다. 아래 예의 경우 {2}다음에 /에 대해서 \가 필요하지만 Shell변수 전달시에는 없이 사용한다.

 

# Shell변수 AWK 적용 전

cat tmp_getpost_dynamic.txt |head -n 10 | awk 'BEGIN{} { match($0,/[0-9]{2}\/[A-Za-z]{3}\/[0-9]{4}/) } {timeVal[substr($0,RSTART,11)]++;} END {for (key in timeVal) printf("%s : %d\n", key, timeVal[key]);}' | sort -k1 -t" "

 

# Shell변수 AWK 적용 후

pattern='[0-9]{2}/[A-Za-z]{3}/[0-9]{4}';
cat tmp_getpost_dynamic.txt |head -n 10 | awk -v pattern="$pattern" 'BEGIN{} { match($0,pattern) } {timeVal[substr($0,RSTART,11)]++;} END {for (key in timeVal) printf("%s : %d\n", key, timeVal[key]);}' | sort -k1 -t" "

 

예외사항

awk명령어 실행시 Invalid multibyte data detected warning메세지가 날 경우 LC_ALL환경변수를 설정해 주면 발생하지 않는다.
export LC_ALL=C;
test@ykd2:~/Accesslog_sample/internal/internal_1$ ./transactions_per_hour_3.sh access.202209230000
awk: cmd. line:1: (FILENAME=- FNR=622768) warning: Invalid multibyte data detected. There may be a mismatch between your data and your locale.

 

RSTART와 RLENGTH는 match함수를 썼을때 가용하며 match를 쓰지 않고 ~ pattern으로 검색시에는 RSTART 및 RLENGTH에 값이 저장되지 않음.

 

 

 

참고 사이트

Learn How to Use Awk Special Patterns ‘BEGIN and END’ – Part 9 (tecmint.com)

https://recipes4dev.tistory.com/171

http://bahndal.egloos.com/621562
https://bunnyandpooh.tistory.com/6

 

반응형