반달가면 이글루에서 백업 - http://bahndal.egloos.com/591077
awk에서 문자열 작업을 할 때 외부 프로그램을 실행하는 방법이다. awk 자체적으로도 제공하는 다양한 함수 외에 외부 명령을 필요로 하는 상황에서 아주 요긴하다.
예시를 하나 생각해 보자. my_data.txt 파일을 읽어서 한 행마다 MD5 해쉬값을 구해야 하는 경우다. awk에는 MD5 해쉬를 계산해 주는 함수가 없으므로 리눅스에서 제공하는 md5sum을 이용해야 한다. 먼저 md5sum 예시를 보자면 아래와 같다.
# 문자열 abc의 MD5해쉬값 계산
echo "abc" | md5sum
0bee89b07a248e27c83fc3d5951213c1 -
md5sum의 출력이 "[MD5해쉬값] - [파일명]" 형태이므로 해쉬값만 취하려면 cut을 이용해서 -c 옵션으로 아래와 같이 앞쪽 32개 바이트만 취하면 된다.
echo "abc" | md5sum | cut -c 1-32
0bee89b07a248e27c83fc3d5951213c1
자, 이제 위의 명령을 awk에 적용해 보자. 아래와 같이 입력하면 된다.
# my_data.txt 파일을 열어서 한 행마다 MD5 해쉬를 계산하여 출력
awk '{
# 실행할 명령을 ext_cmd 변수에 할당
ext_cmd="echo " $0 " | md5sum | cut -c 1-32";
# ext_cmd 실행후 결과값을 md5val 변수에 할당
ext_cmd | getline md5val;
# 파이프 닫기
close(ext_cmd);
# 결과 출력
print $0 " MD5해쉬:" md5val;
}' my_data.txt
먼저 ext_cmd 변수에 저장된 명령(리눅스 shell에서 입력될 문자열)을 보자. echo 명령의 인자로 awk에서 읽은 행 전체($0)를 적용하고, 이 결과를 파이프(|)로 넘겨서 MD5 해쉬를 계산한다. 예를 들어 입력 받은 행이 abc라면 ext_cmd는 "echo abc | md5sum | cut -c 1-32" 이렇게 될 것이다.
ext_cmd 실행후 이 결과는 awk의 getline을 이용해서 읽어서 변수 md5val에 저장한다. 실행이 끝나고 나면 잊지 말고 close 함수를 이용해서 파이프를 닫아주자. 파일 크기가 작다면 닫지 않아도 괜찮을 수 있으나, 대용량 파일에 작업을 하면 시스템에서 열 수 있는 파이프 수를 초과해서 실행이 중단될 수 있다.
이제 print로 결과를 출력해 주면 된다.
'bash script' 카테고리의 다른 글
[bash:uniq, sort] 한글 문자열에 대한 중복 제거 문제 (0) | 2023.07.22 |
---|---|
[bash: read, while] 공백을 포함한 이름을 가진 파일들에 대한 반복 작업 - 2 (0) | 2023.07.22 |
[bash: awk] 특정 위치(field)의 문자열에서 특정 길이 만큼 문자열 추출 (substr) (0) | 2023.07.20 |
[bash: while, read, <] 텍스트 파일을 한줄씩 읽어서 작업하기 (0) | 2023.07.20 |
[bash: grep] 두개의 파일에서 공통으로 출현하는 문자열 찾기 (0) | 2023.07.19 |