웹사이트 검색

While 루프를 사용하여 Bash 스크립트에서 파일을 읽는 다양한 방법


이 문서는 while 루프를 사용하여 bash 스크립트에서 파일을 읽는 방법에 관한 것입니다. 파일을 읽는 것은 프로그래밍에서 일반적인 작업입니다. 다양한 방법과 어떤 방법을 사용하는 것이 더 효율적인지 잘 알고 있어야 합니다. Bash에서는 단일 작업을 여러 가지 방법으로 달성할 수 있지만 작업을 완료하는 최적의 방법은 항상 있으므로 이를 따라야 합니다.

while 루프를 사용하여 파일 내용을 읽는 방법을 알아보기 전에 while 루프가 작동하는 방식에 대한 간단한 입문서입니다. While 루프는 조건을 평가하고 조건이 참일 때 주어진 코드 세트를 반복합니다.

while [ CONDITION ]
do
    code block
done

while 루프 구문을 분석해 보겠습니다.

  • while 루프는 while 키워드로 시작하고 그 뒤에 조건이 와야 합니다.
  • 조건[ ] 또는 [[ ]]로 묶어야 합니다. 루프가 실행되려면 조건이 항상 true를 반환해야 합니다.
  • 실제 코드 블록은 dodone 사이에 배치됩니다.
NUMBER=0

while [[ $NUMBER -le 10 ]]
do
    echo " Welcome ${NUMBER} times "
    (( NUMBER++ ))
done

이는 NUMBER10보다 크지 않을 때까지 루프를 실행하고 에코 문을 인쇄하는 매우 간단한 예입니다.

while과 함께 read 명령을 사용하여 파일 내용을 한 줄씩 읽습니다. 다음은 whileread 명령이 결합되는 방식에 대한 구문입니다. 이제 파일을 입력으로 전달하는 다양한 방법이 있으며 이를 모두 살펴보겠습니다.

SYNTAX
while read VARIABLE
do
    code
done

Linux의 파이핑

일반적으로 터미널에서 파일 내용을 보려면 cat 명령을 사용합니다. 또한 cat 명령의 출력을 grep, sort 등과 같은 다른 명령으로 파이프합니다.

마찬가지로 여기서는 cat 명령을 사용하여 파일의 내용을 읽고 이를 while 루프로 파이프합니다. 데모를 위해 /etc/passwd 파일을 사용하고 있지만 이 파일을 함부로 다루는 것은 바람직하지 않으므로 원할 경우 이 파일의 백업 복사본을 가져가서 재생해 보세요.

cat /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

위의 코드가 제출되면 어떤 일이 발생하는지 분석해 보겠습니다.

  • cat /etc/passwd는 파일의 내용을 읽고 파이프를 통해 입력으로 전달합니다.
  • read 명령은 cat 명령에서 입력으로 전달된 각 줄을 읽고 이를 LREAD 변수에 저장합니다.
  • read 명령은 EOL이 해석될 때까지 파일 내용을 읽습니다.

head, tail과 같은 다른 명령을 사용하고 while 루프에 파이프할 수도 있습니다.

head -n 5 /etc/passwd | while read LREAD
do
    echo ${LREAD}
done

Linux의 입력 리디렉션

입력 리디렉션 연산자 (<)를 사용하여 파일 내용을 while 루프로 리디렉션할 수 있습니다.

while read LREAD
do
    echo ${LREAD}
done < /etc/passwd | head -n 5

파일 이름을 변수에 저장하고 리디렉션 연산자를 통해 전달할 수도 있습니다.

FILENAME="/etc/passwd"

while read LREAD
do
    echo ${LREAD}
done < ${FILENAME}

파일 이름을 스크립트에 인수로 전달할 수도 있습니다.

while read LREAD
do
    echo ${LREAD}
done < $1 | head -n 5

내부 필드 구분 기호

다양한 유형의 파일 형식(CSV, TXT, JSON)으로 작업할 수 있으며 다음을 기준으로 파일 콘텐츠를 분할할 수 있습니다. 사용자 정의 구분 기호. 이 경우 '내부 필드 구분 기호(IFS)'를 사용하여 파일 내용을 분할하여 변수에 저장할 수 있습니다.

어떻게 작동하는지 보여드리겠습니다. 구분 기호로 콜론 (:)이 있는 /etc/passwd 파일을 살펴보세요. 이제 한 줄의 각 단어를 분할하여 별도의 변수에 저장할 수 있습니다.

아래 예에서는 콜론을 구분 기호로 사용하여 /etc/passwd 파일을 분할하고 각 분할을 다른 변수에 저장합니다.

while IFS=":" read A B C D E F G
do
    echo ${A}
    echo ${B}
    echo ${C}
    echo ${D}
    echo ${E}
    echo ${F}
    echo ${G}
done < /etc/passwd

위 스크린샷에서는 스크린샷 크기를 고려하여 한 줄만 분할하여 표시했습니다.

Linux의 빈 줄

파일 콘텐츠를 루프할 때 빈 줄은 무시되지 않습니다. 이를 시연하기 위해 아래 내용이 포함된 샘플 파일을 만들었습니다. 4줄과 몇 개의 빈 줄, 선행 공백, 후행 공백, 2행의 탭 문자 및 일부 이스케이프 문자(\n\t)가 있습니다.

while read LREAD
do
    echo ${LREAD}
done < testfile

결과를 보면 빈 줄이 무시되지 않습니다. 또한 주목해야 할 흥미로운 점은 read 명령으로 공백이 잘리는 방식입니다. 파일 내용을 읽을 때 빈 줄을 무시하는 간단한 방법은 문자열 길이가 0인지 확인하는 -z 플래그와 함께 테스트 연산자를 사용하는 것입니다. 이제 동일한 예를 반복하되 이번에는 테스트 연산자를 사용해 보겠습니다.

while read LREAD
do
    if [[ ! -z $LREAD ]]
    then
        echo ${LREAD} 
    fi
done < testfile

이제 출력에서 빈 줄이 무시되는 것을 볼 수 있습니다.

이스케이프 문자

\n, \t, \c와 같은 이스케이프 문자는 파일을 읽을 때 인쇄되지 않습니다. 이를 설명하기 위해 이스케이프 문자가 거의 없는 동일한 샘플 파일을 사용하고 있습니다.

while read LREAD
do
    echo ${LREAD}
done < testfile

출력에서 이스케이프 문자가 의미를 잃고 \n\t 대신 nt만 인쇄되는 것을 볼 수 있습니다. . 백슬래시 해석을 방지하려면 -r을 사용할 수 있습니다.

while read -r LREAD
do
    echo ${LREAD}
done < testfile

이것이 바로 이 기사입니다. 피드백이나 팁이 있으면 답변을 듣고 싶습니다. 귀하의 피드백은 더 나은 콘텐츠를 만드는 데 도움이 됩니다. 계속 읽어보시고 계속 지원해 주세요.