티스토리 뷰

유닉스 쉘에서 파일을 읽어서 처리하는 프로그램이 필요하였다. 솔직히 말하면 프로프레임에는 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를 미리 선언해 줘도 효과는 동일하고 

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

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

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

AIX dbx 사용 core 분석  (0) 2017.03.25
티베로 쿼리 실행 쉘 예제  (0) 2016.10.29
유닉스 쉘에서 스페이스 잘리지 않게 유지하고 읽는 방법  (0) 2016.10.29
gdb 사용법  (0) 2016.07.19
LIBPATH 환경 변수  (0) 2016.06.25
*.a 와 *.so 차이점  (1) 2016.06.25
댓글
댓글쓰기 폼