Bash를 사용하여 한 줄씩 파일을 읽는 방법

Suraj Joshi 2020년10월2일
Bash를 사용하여 한 줄씩 파일을 읽는 방법

Bash에서는 파일에 저장된 데이터를 한 줄씩 처리해야하는 여러 상황에 직면 할 수 있습니다. 이 경우 파일의 내용을 읽어야합니다. Bash에서read 명령을 사용하여 한 줄씩 파일을 읽습니다.

Bash에서 한 줄씩 파일 읽기

통사론

while IFS= read -r line
do
  echo "$line"
done < file_name

file_name파일의 내용을 한 번에 한 줄씩 읽고 터미널에 한 줄씩 인쇄합니다. 루프는 파일의 끝에 도달 할 때까지 실행됩니다. IFS는 선행 및 후행 공백을 유지하는 데 도움이되는 널 문자열로 설정됩니다.

또는 위의 명령을 한 줄에서 다음 명령으로 바꿀 수도 있습니다.

while IFS= read -r line; do echo $line; done < file_name

예: Bash에서 한 줄씩 파일 읽기

이 예에서는 각 줄에 숫자가 포함 된 file.txt파일을 읽고 파일에있는 모든 숫자의 합계를 찾습니다.

file.txt의 내용

1
5
6
7
8
10
#!/bin/bash

sum=0
echo "The numbers in the file are:"
while IFS= read -r line
do
  echo "$line"
  sum=$(( $sum + $line ))
done < file.txt
echo "The sum of the numbers in the file is:$sum"

출력:

The numbers in the file are:
1
5
6
7
8
The sum of the numbers in the file is:27

file.txt라는 파일에서 한 줄씩 숫자를 읽은 다음 모든 숫자를 합산하고 마지막으로 그 합을 에코합니다.

예: 파일의 필드를 변수로 설정

여러 변수를read 명령에 전달하여 파일의 필드를 변수로 설정할 수 있습니다.read 명령은 IFS 값을 기준으로 한 행 내에서 필드를 구분합니다.

file.txt의 내용

Rohit-10
Harish-30
Manish-50
Kapil-10
Anish-20
#!/bin/bash

while IFS=- read -r name earnings
do
    echo "$name" has made earnings of "$earnings" pounds today!
done < file.txt

출력:

Rohit has made earnings of 10 pounds today!
Harish has made earnings of 30 pounds today!
Manish has made earnings of 50 pounds today!
Kapil has made earnings of 10 pounds today!

여기서는 두 개의 변수를read 명령에 전달했기 때문에 파일의 각 줄이 두 개의 세그먼트로 나뉩니다. 첫 번째 세그먼트는 줄의 시작 부분에서 첫 번째 -까지 확장되는 name변수에 할당되고 나머지 부분은 earnings변수에 할당됩니다.

Bash에서 파일을 읽는 다른 방법

#!/bin/bash

while IFS=- read -r name earnings
do
    echo "$name" has made earnings of "$earnings" pounds today!
done < <(cat file.txt )

출력:

Rohit has made earnings of 10 pounds today!
Harish has made earnings of 30 pounds today!
Manish has made earnings of 50 pounds today!
Kapil has made earnings of 10 pounds today!

여기서 파일명file.txtcat 명령의 출력으로 프로그램에 전달됩니다.

작가: Suraj Joshi
Suraj Joshi avatar Suraj Joshi avatar

Suraj Joshi is a backend software engineer at Matrice.ai.

LinkedIn