반응형
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
반응형
'Infra Architecture > linux' 카테고리의 다른 글
[ Linux ] 유저 생성 (0) | 2023.01.08 |
---|---|
[ Linux ] Shell Script 산술연산/조건문 (0) | 2023.01.07 |
[ Shell Script ] grep 명령어 (0) | 2023.01.06 |
[ Linux ] 윈도우와 리눅스의 줄바꿈 차이 (0) | 2023.01.05 |
[ Linux ] 리눅스에서 16진수로 출력(hexdump) (0) | 2023.01.05 |