Bash 스크립트를 작성할 때 파일을 한 줄씩 읽어야 하는 경우가 있습니다. 예를 들어 스크립트에서 처리해야 하는 데이터가 포함된 텍스트 파일이 있을 수 있습니다.
Bash에서 파일을 한 줄씩 읽는 방법에 대해 설명합니다.
파일 라인별 구문을 읽기
파일을 한 줄로 읽는 가장 일반적인 구문은 다음과 같습니다.
while IFS= read -r line; do
printf '%s\n' "$line"
done < input_file
또는 동등한 단일 라인 버전이 있습니다.
while IFS= read -r line; do printf '%s\n' "$line"; done < input_file
입력 파일(input_file)은 while 루프에 리디렉션된 파일의 이름입니다. 읽기 명령은 파일을 줄별로 처리하여 각 줄을 줄 변수에 할당합니다. 모든 라인이 처리되면 루프가 종료됩니다.
기본적으로 read 명령은 백슬래시를 이스케이프 문자로 해석하고 모든 선행 및 후행 공백을 제거하며, 이로 인해 예기치 않은 동작이 발생할 수 있습니다. 백슬래시 이스케이프를 비활성화하기 위해 -r 옵션을 사용하여 명령을 호출하고 트리밍을 비활성화하려면 내부 필드 분리기(IFS)가 지워집니다.
에코 대신 [프린트f]를 사용하여 코드를 더 휴대할 수 있도록 하고 원치 않는 행동을 방지하고 있습니다. 예를 들어, 라인에 "-e"와 같은 값이 포함되어 있으면 에코 옵션으로 처리됩니다.
줄별로 파일 줄을 읽는 예
다음 예를 살펴보겠습니다. distross라는 이름의 파일이 있습니다고 가정해 보죠.txt에는 가장 인기 있는 일부 Linux 배포 목록과 해당 패키지 관리자가 쉼표(,)로 구분되어 있습니다.
# distros.txt
Ubuntu,apt
Debian,apt
CentOS,yum
Arch Linux,pacman
Fedora,dnf
파일을 한 줄 한 줄 읽으려면 터미널에서 다음 코드를 실행합니다.
while IFS= read -r line; do
printf '%s\n' "$line"
done < distros.txt
코드는 파일을 줄별로 읽고, 각 줄을 변수에 할당한 후 인쇄합니다. 기본적으로 cat 명령을 사용하여 파일 내용을 표시하는 것과 동일한 출력이 표시됩니다.
appt를 사용하는 배포판만 인쇄하려면 어떻게 해야 합니까? 한 가지 방법은 if 문을 사용하여 라인에 적절한 하위 문자열이 포함되어 있는지 확인하는 것입니다.
while IFS= read -r line; do
if [[ "$line" == *"apt"* ]]; then
printf '%s\n' "$line"
fi
done < distros.txt
# Ubuntu,apt
# Debian,apt
파일을 줄별로 읽을 때 둘 이상의 변수를 읽기 명령에 전달할 수도 있습니다. 읽기 명령어는 IFS를 기준으로 줄을 필드로 분할합니다. 첫 번째 필드는 첫 번째 변수에 할당되고, 두 번째 필드는 두 번째 변수에 할당됩니다. 필드가 변수보다 많을 경우, 나머지 필드는 마지막 변수에 할당됩니다.
다음 예에서는 IFS를 쉼표(,)로 설정하고 두 변수 distro와 pm을 read 명령에 전달합니다. 줄의 시작부터 첫 번째 쉼표가 첫 번째 변수(디스트로)에 할당되고, 나머지 줄은 두 번째 변수(pm)에 할당됩니다.
while IFS=, read -r distro pm; do
printf '%s is the package manager for %s\n' "$pm" "$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
printf '%s\n' "$line"
done < <(cat input_file )
문자열을 사용
여기서 문자열은 여기서 문서의 변형입니다. 문자열(catinput_file)은 새 줄을 유지합니다.
while IFS= read -r line; do
printf '%s\n' "$line"
done <<< $(cat input_file )
파일 설명자를 사용
파일 설명자를 사용하여 루프에 입력을 제공할 수도 있습니다.
while IFS= read -r -u9 line; do
printf '%s\n' "$line"
done 9< input_file
파일 설명자로 작업할 때는 셸 내부 파일 설명자와 충돌하지 않도록 4에서 9 사이의 숫자를 사용하십시오.
'SW > 리눅스' 카테고리의 다른 글
CentOS 7 : Memcached 설치 방법, 예제, 명령어 (0) | 2021.09.06 |
---|---|
Linux : Wc 명령어, 예제, 사용 방법 (줄, 단어, 문자 세기 ) (0) | 2021.09.05 |
Linux : Uptime 명령어, 예제, 사용 방법 (0) | 2021.09.03 |
Raspberry Pi : SSH 활성화 방법, 예제, 명령어 (1) | 2021.09.02 |
Linux : Sleep 명령어 사용 방법, 예제 (Bash Script 중지) (0) | 2021.09.01 |