컴퓨터활용/유닉스

유닉스 쉘에서 스페이스 잘리지 않게 유지하고 읽는 방법

멜번초이 2016. 10. 29. 10:22

유닉스 쉘에서 파일을 읽어서 처리하는 프로그램이 필요하였다. 솔직히 말하면 프로프레임에는 pfmtcl 이라는 테스트거래하는 프로그램이 있는데 이미지로그의 전문을 읽어서 연속으로 거래를 날리고자 했다.  그런데 전문 끝에는 스페이스가 있는데 쉘에서 이것을 읽으면 모두 날라가버리고 Trim되어 읽힌다는 것이다. 

인터넷을 찾아보면 따옴표(") 로 감싸면 된다지만 이게 또 잘 안된다. 끝에 있는 스페이는 이미 읽을 때 지워버리고 읽어버리기 때문에 소용없는 일이었다. 

1
2
3
while read line; do
   echo "$line"
done < "$1"
cs

결국 인터넷을 더 찾아 보니 IFS (Internal Field Separator) 를 사용하면 있는 그대로 읽어준다는 것을 알게 되었다.  테스트해 보니 결과는 대 만족..  IFS 는 오로지 데이터의 구분을 줄바꿈 문자로 구분을 엄격하게 해서 읽어 들인다고 한다.

1
2
3
while IFS= read -r line; do
   pfmTcl -"$line"
done < "$1"
cs

읽은 라인이 빈라인인지 체크하는 방법도 소개되어 있네.  일설에는 라인의 문자개수가 0 인지 체크한다던지 (wc 사용), 첫시작문자가 널로 시작되는 지 등 여러가지 방법이 소개 되지만 아래 방법이 제일 좋은 거 같다. 

1
2
3
4
5
6
while IFS= read -r line; do
   if [ -"$line" ]
   then
      echo "empty line detected"
   fi
done < "$1"
cs

파일을 읽어 들이는 방법에 cat 하는 방법도 있다. IFS를 while 문 안이 아니라 시작전에 미리 선언해 줘도 효과는 동일하다.

1
2
3
4
5
IFS=
cat $1 | 
while read -r line; do
    echo "$line"
done  
cs

결론 : 문자열에서 스페이스를 잘 보존하려면  쌍싸옴표(")와 IFS 를 동시에 잘 써야 한다


read [-r] [이름 ...] 표준 입력으로부터 한 줄을 읽어들여 read 뒤에 나열한 변수에 저장한다.그 첫번째 단어를 첫번째 변수에 할당하고 두번째 단어를 두번째 변수에 할당하고 나머지 남은 단어들을 마지막 변수에 할당한다.이때 IFS지정이 없을 경우 space문자는 자동 trim 되게 된다. 반면에 IFS 에 특정 단어를 지정하면 그 단어를 구분자로 인식한다. IFS에 아무런 단어도 적지 않으면 읽어들인 행을 첫번째 변수에 할당한다. 이 때 space 문자 trim 없이 그대로 할당된다.read는 파일 끝 문자를 만난 경우를 제외하고 반환값은 0 이다. -r 옵션을 주면 백슬래쉬-개행 문자쌍을 무시하지 않고 백슬래쉬를 행의 일부로 인식한다.


'컴퓨터활용 > 유닉스' 카테고리의 다른 글

AIX dbx 사용 core 분석  (2) 2017.03.24
티베로 쿼리 실행 쉘 예제  (0) 2016.10.29
gdb 사용법  (0) 2016.07.19
LIBPATH 환경 변수  (2) 2016.06.24
*.a 와 *.so 차이점  (1) 2016.06.24