기계적 인조 인간

bash에서 파일을 한 줄씩 읽는 방법

Sweet Tart Dough Recipe - LeGourmetTV

Sweet Tart Dough Recipe - LeGourmetTV

차례:

Anonim

Bash 스크립트를 작성할 때 때때로 파일을 한 줄씩 읽어야하는 상황에 처하게됩니다. 예를 들어, 스크립트에서 처리해야하는 데이터가 포함 된 텍스트 파일이있을 수 있습니다.

이 튜토리얼에서는 Bash에서 파일을 한 줄씩 읽는 방법에 대해 설명합니다.

한 줄씩 파일 구문 읽기

파일을 한 줄씩 읽는 가장 일반적인 구문은 다음과 같습니다.

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

또는 동등한 단일 라인 버전:

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

어떻게 작동합니까?

입력 파일 ( input_file )은 read 명령으로 read 파일의 이름입니다. read 명령은 파일을 한 줄씩 읽어 각 줄을 line 변수에 할당합니다. 모든 라인이 처리되면 while 루프가 종료됩니다. 내부 필드 구분 기호 ( IFS )는 read 명령의 기본 동작 인 선행 및 후행 공백을 유지하기 위해 널 문자열로 설정됩니다.

한 줄씩 파일 읽기 예제

다음 예를 살펴 보겠습니다. 가장 널리 사용되는 Linux 배포 목록과 패키지 관리자가 쉼표 ( , )로 구분 된 distros.txt 라는 파일이 있다고 가정합니다.

distros.txt

Ubuntu, apt Debian, apt CentOS, yum Arch Linux, pacman Fedora, dnf

파일을 한 줄씩 읽으려면 터미널에서 다음 코드를 실행하십시오.

while IFS= read -r line do echo "$line" done < distros.txt

코드는 파일을 한 줄씩 읽고 각 줄을 변수에 할당하고 변수를 에코합니다. 기본적으로 cat 명령을 사용하여 파일 내용을 표시하는 것과 동일한 출력이 표시됩니다.

apt를 사용하는 배포판 만 인쇄하려면 어떻게합니까? 한 가지 방법은 if ​​문을 사용하고 행에 apt 하위 문자열이 포함되어 있는지 확인하는 것입니다.

while IFS= read -r line do if]; then echo "$line" fi done < distros.txt

Ubuntu, apt Debian, apt

파일을 한 줄씩 읽을 때 하나 이상의 변수를 read 명령에 전달하면 IFS 기반의 행을 필드로 분할합니다. 첫 번째 필드는 첫 번째 변수, 두 번째에서 두 번째 변수 등에 지정됩니다. 변수보다 많은 필드가 있으면 남은 필드가 마지막 변수에 할당됩니다.

다음 예제에서는 IFS를 쉼표 ( , )로 설정하고 두 개의 변수 distro pm 을 read 명령에 전달합니다. 행의 시작부터 첫 번째 쉼표까지의 모든 것이 첫 번째 변수 ( distro )에 지정되고 나머지 행은 두 번째 변수 ( pm )에 지정됩니다.

while IFS=, read -r distro pm do echo "$pm" is the package manager for "$distro" done < distros.txt

apt is the package manager for Ubuntu apt is the package manager for Debian yum is the package manager for CentOS pacman is the package manager for Arch Linux dnf is the package manager for Fedora

대체 파일 읽기 방법

프로세스 대체 사용

프로세스 대체를 통해 명령의 출력을 파일 이름으로 전달할 수 있습니다.

while IFS= read -r line do echo "$line" done < <(cat input_file)

Here 문자열 사용

Here String은 Here 문서의 변형입니다. 문자열 (cat input_file) 은 줄 바꿈을 유지합니다.

while IFS= read -r line do echo "$line" done <<< $(cat input_file)

파일 디스크립터 사용

파일 디스크립터를 사용하여 루프에 입력을 제공 할 수도 있습니다.

while IFS= read -r -u9 line do echo "$line" done 9< input_file

파일 디스크립터에 대해 작업 할 때 쉘 내부 파일 디스크립터와의 충돌을 피하려면 4와 9 사이의 숫자를 사용하십시오.

결론

Bash에서는 파일 이름을 while read 루프에 대한 입력으로 제공하여 파일을 한 줄씩 읽을 수 있습니다.

bash 터미널