bash script2023. 7. 20. 08:59

 

반달가면 이글루에서 백업 - 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로 결과를 출력해 주면 된다.

728x90
Posted by 반달가면