[Linux 셸 스크립트] 텍스트 처리 - 069 텍스트 파일에서 구분자를 지정해서 컬럼 추출하기
본문 바로가기
IT 이야기/Linux 셸 스크립트

[Linux 셸 스크립트] 텍스트 처리 - 069 텍스트 파일에서 구분자를 지정해서 컬럼 추출하기

by 찬찬이 아빠 2021. 4. 7.
반응형
  1. 사용 명령어

(1) env

(2) grep

(3) cut

 

  2. 키워드 & 사용처

(1) 키워드

환경 변수, 분지라, 컬럼

 

(2) 사용처

설정된 환경 변수 목록을 얻어서 어떤 변수명이 정의되어 있는지 확인하고 싶을 때 사용합니다.

 

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

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

 

 

  4. 스크립트

#!/bin/sh

 

# 미리 설정하지 안흐면 에러가 발생하는 환경 변수 정의

envname="TMPVAR"                   

 

# env 명령어로 환경 변수 목록을 표시해서 cut 명령어로

# * 첫 번째 값을 표시 [-f 1]

# * 분지라는 : [-d "="]로 표시

env | cut -f 1 -d "=" > env.lst           

 

# 확인할 환경 변수명이 env.lst와 같게 정의되어 있는지 확인

grep -q "^${envname}$" env.lst               

 

if [ $? - eq 0 ]; then             

    # 환경 변수가 설정되어 있으면 start.sh 실행

    echo "환경 변수 $envname가 설정되어 있습니다."           

    ./start.sh

else

    ceho "환경 변수 $envname가 설정되어 있지 않습니다."

fi

 

 

  5. 해설

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

 

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

 

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

$ env
OHOSTNAME=www.example.com
TERM=xterm
SHELL=/bin/bash
HISTSIZE=1000
...
LOGNAME=park
G_BROKEN_FILENAMES=1
_=/bin/env...

 

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

 

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

 

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

 

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

 

 

<주의사항>

test 명령어 빈 문자열인지 확인하는 -z 연산자를 써서 환경 변수값이 빈 문자열인지 확인하는게 일반적입니다.

if [ -z "$TMPVAR" ]; then
    echo "환경 변수 TMPVAR는 비었음"
else
	echo "환경 변수 TMPVAR는 설정되어 있음"
fi

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

 

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

$ awk-F='{print $1}'

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

 

 

 

참고서적 : 유닉스 리눅스 셸 스크립트 예제 사전

반응형

댓글