반달가면 이글루에서 백업 - 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`
성격이 꼼꼼하지 못해서 그런지 몇번이나 따옴표를 빼먹는 실수를... -_-;
'bash script' 카테고리의 다른 글
[bash: cut, rev] 뒤쪽에서부터 문자열(단어) 가져오기 (0) | 2020.12.28 |
---|---|
[bash: mv, rename] 파일/디렉토리 이름 바꾸기 (한개 또는 여러개 한꺼번에) (0) | 2020.12.23 |
[bash: find, cp] 조건에 맞는 파일을 찾아 복사하기 (0) | 2020.12.02 |
[bash: split, cat] 파일 분할/재조립 (0) | 2020.11.26 |
[bash: for, sed, seq] 파일에서 홀수번째/짝수번째 행만 골라내기 (0) | 2020.11.24 |