bash script2020. 12. 16. 17:41

 

반달가면 이글루에서 백업 - bahndal.egloos.com/467202

 

shell script를 만들어 쓰다 보면 파일의 특정 행을 읽어서 이 행의 문자열들을 하나씩 가져다가 작업을 해야 하는 경우가 종종 생긴다.

 

 

예를 들어 people.txt에 이름과 이메일이 아래와 같은 형태로 저장되어 있다고 하자. 이름과 이메일 사이는 콜론(:)으로 구분한 경우이다.

 

john:john@mail.com

jane:jane@mail.com

 

이 파일에서 2번째 행, 즉 jane의 정보를 가지고 뭔가 작업을 하려고 한다면 script에 아래와 같은 내용이 들어갈 수 있다. (sed 명령에 대한 내용은 이전 게시물을 참고하자)

 

# people.txt에서 2번째 행을 뽑아서 data_str 변수에 저장

data_str=`sed -n 2p people.txt`

# 첫번째 필드를 name 변수에 저장

name=`echo $data_str | cut -d':' -f1`

# 두번째 필드를 email 변수에 저장

email=`echo $data_str | cut -d':' -f2`

# 이제 작업 시작

...

 

위의 예시는 별 문제가 없지만, 만약 구분자를 탭(tab)으로 사용한 파일을 다룰 때는 문제가 발생한다. 예를 들어 jane:jane@mail.com 대신 jane[탭]jane@mail.com 이런 형식으로 저장된 파일이라면 echo 명령으로 변수값을 출력할 때 잊지 말고 따옴표를 사용해 주자.

 

echo "$data_str" 이런 식으로 해야 한다. 따옴표를 사용하지 않으면 탭이 공백(space)으로 대체된다.

 

# data_str 변수에 jane[탭]jane@mail.com이 할당된 경우

echo $data_str

# 결과는 jane jane@mail.com (탭이 사라지고 공백으로 대체)

echo "$data_str"

# 결과는 jane[탭]jane@mail.com (탭이 보존됨)

 

따라서 탭을 구분자로 사용한 파일을 가지고 작업을 할 때는 앞의 예시가 아래와 같이 변경되어야겠다.

 

data_str=`sed -n 2p people.txt`

# data_str 변수로 받은 문자열의 구분자가 탭인 경우

# 첫번째 필드를 name 변수에, 두번째 필드를 email 변수에 저장

# cut 명령의 기본 구분자가 탭이므로 -d 옵션 불필요

name=`echo "$data_str" | cut -f1`

email=`echo "$data_str" | cut -f2`

 

성격이 꼼꼼하지 못해서 그런지 몇번이나 따옴표를 빼먹는 실수를... -_-;

 

 

728x90
Posted by 반달가면