텍스트처리_02 텍스트 파일에서 구분자를 지정해서 컬럼 추출하기

 
  • 출처 : 유닉스 리눅스 쉘스크립트 예제사전_한빛미디어

명령어: env, grep, cut
키워드: 환경 변수, 분리자, 컬럼
사용처: 설정된 환경 변수 목록을 얻어서 어떤 변수명이 정의되어 있는지 확인하고 싶을 때


실행예제

$ ./env.sh  #----------- 환경 변수 TMPVAR가 없으면 start.sh가 실행되지 않음
TMPVAR is null

$ export TMPVAR=1  #---- 환경 변수 TMPVAR 설정
$ ./env.sh
TMPVAR is 1
[START] start.sh

스크립트

#!/bin/sh

# 미리 설정하지 않으면 에러가 발생하는 환경 변수 정의
envname="TMPVAR"  #------------------------------------- 1

# env 명령어로 환경 변수 목록을 표시해서 cut 명령어로
# * 첫 번째 값을 표시 [-f 1]
# * 분지라는 : [-d "="]로 표시
env | cut -f 1 -d "=" > env.lst #----------------------- 2

# 확인할 환경 변수명이 env.lst와 같게 정의되어 있는지 확인
grep -q "^${envname}$" env.lst  #----------------------- 3

if [ $? - eq 0 ]; then  #------------------------------- 4
    # 환경 변수가 설정되어 있으면 start.sh 실행
    echo "환경 변수 $envname가 설정되어 있습니다."  #----- 5
    ./start.sh
else
    echo "환경 변수 $envname가 설정되어 있지 않습니다."
fi

   

해설

이 스크립트는 현재 설정한 환경 변수 목록을 env 명령어로 취득해서 지정한 환경 변수가 설정되어 있는지 판별합니다. 셸 스크립트는 환경 변수에 의존된 코드가 많으므로 미리 확인해서 사용하는 경우를 가정합니다. 이 예제에서는 start.sh란 스크립트를 내부에서 실행하는데 start.sh를 실행하려면 환경 변수 TMPVAR 설정이 필요하다고 합시다.

우선 1에서 미리 설정해둬야 하는 환경 변수명을 셸 변수 envname에 대입합니다. 여기서 지정한 TMPVAR이라는 환경 변수가 지정되어 있지 않으면 에러가 발생합니다.

2에서 env 명령어를 사용해서 설정되어 있는 환경 변수를 임시 파일 env.lst에 출력합니다. env 명령어 출력 예는 다음과 같습니다.

  • env 명령어로 환경 변수 출력
    $ env
    HOSTNAME=www.example.com
    TERM=xterm
    SHELL=/bin/bash
    HISTSIZE=1000
    ...
    LOGNAME=user1
    G_BROKEN_FILENAMES=1
    _=/bin/env...
    

env 명령어 출력 결과는 “환경 변수명=값”처럼 = 기호로 구분됩니다. 환경 변수명은 첫 번째 컬럼에 있는데 이런 텍스트 파일에서 지정한 컬럼값을 추출할 때는 ‘구분자를 지정해서 n번째 값을 추출’하는 명령어를 사용합니다. 이런 방법은 몇 가지 있는데 여기에서는 cut 명령어를 써봅시다.

cut 명령어는 텍스트 파일에서 어떤 일부분을 추출하는 명령어입니다. -d 옵션으로 구분자를 지정해서 -f 명령어와 이어진 숫자로 추출할 장소를 지정합니다. 2에서 -d “=”로 지정해서 =로 나누고 -f 1로 첫 번째 값 즉 설정된 환경 변수명을 추출할 수 있습니다.

3에서 확인하고 싶은 환경 변수명이 정의되어 있는지 확인합니다. grep 명령어는 이미 출력한 환경 변수를 기록한 임시 파일과 비교해서 셸 변수 envname에 정의한 값이 환경 변수로 설정되어 있는지 판별합니다. 여기서 명령어 종료 스테이터스만 사용하므로 grep 명령어 결과를 출력하지 않도록 -q 옵션을 사용합니다.

4에서 grep 명령어 종료 스테이터스 $?를 사용해서 환경 변수가 설정되어 있는지에 따라 분기합니다. grep 명령어로 일치한 줄이 있으면 종료 스테이터스는 0이 되므로 이것은 셸 변수 envname으로 정의된 환경 변수가 설정되어 있다는 뜻입니다. 5에서는 환경 변수가 설정되어 있다고 표시하고, 이어서 스크립트 start.sh를 실행합니다. 여기서 이 스크립트는 단순히 [START] start.sh라고 표시하는데 각자 상황에 맞게 수정하면 됩니다.

   

주의사항

  • test 명령어 빈 문자열인지 확인하는 -z 연산자를 써서 환경 변수값이 빈 문자열인지 확인하는게 일반적입니다.
    if [ -z "$TMPVAR" ]; then
      echo "환경 변수 TMPVAR는 비었음"
    else
      echo "환경 변수 TMPVAR는 설정되어 있음"
    fi
    

    이 방법은 환경 변수가 미정의인지 아니면 빈 문자열로 설정되었는지 구분할 수 없습니다. 다만 실제로는 큰 차이가 없습니다.

  • awk 명령어로 =이 구분자인 텍스트 파일에서 첫 번째 컬럼을 추출하려면 구분자 문자열을 지정하는 -F 옵션을 사용합니다.
    $ awk-F='{print $1}'
    

    하지만 이 예제에서는 짧고 알기 쉬운 cut 명령어를 사용했습니다.