티스토리 뷰

728x90

안녕하세요. 개발개입니다.

 

이번 글에서는 1) 파일을 라인 단위로 읽은 결과2) 명령어 처리 결과에 대한 다중 결과를
while 문을 통해 반복 처리하는 방법에 대해 알아보도록 하겠습니다.

 

오타, 오류 혹은 기타 의견은 언제든지 환영합니다.

 

 

 


 

 

1. 파일을 라인 단위로 읽어 반복 처리

  - Redirection을 이용하는 경우

#!/bin/bash

while read [라인변수명]; do
	[반복작업할 내용 작성]
done < [파일명]

  - Pipeline을 이용하는 경우

#!/bin/bash

cat [파일명] | while read [라인변수명]; do
	[반복작업할 내용 작성]
done

 

예시 1)

특정 디렉토리에 있는 파일 명을 파일(filelist.txt)에 저장하고

이로부터 읽어들인 각 라인(file 변수)을 출력하기

 

1-0) 대상 파일 목록(files 디렉토리)을 확인합니다.

ls명령어를 통해 files 디렉토리 내 파일 목록 확인

1-1) files 디렉토리 내에 있는 파일 목록을 filelist.txt에 저장합니다.

ls files > filelist.txt

ls명령어와 redirection을 통해 파일 목록 저장

1-2) cat 명령어를 통해 filelist.txt 내용 확인할 수 있습니다.

cat filelist.txt

cat명령어를 통해 filelist.txt 내용 확인

1-3) vi 명령어를 이용하여 readFromFile.sh 이름으로 shell script를 작성합니다.

vi readFromFile.sh

  - Redirection을 이용한 경우

 

#!/bin/bash

while read file; do
# file: 읽어올 라인에 대한 변수명 지정
	echo $file
	# 변수 file의 값을 불러와 출력
done < filelist.txt
# filelist.txt로부터 읽어들임

  - Pipeline을 이용한 경우

#!/bin/bash

cat filelist.txt | while read file; do
# cat filelist.txt 결과 값을 while 문으로 전달
# file: 읽어올 라인에 대한 변수명 지정
	echo $file
	# 변수 file의 값을 불러와 출력
done

1-4) 실행권한을 부여한 후 실행합니다.

chmod +x readFromFile.sh
./readFromFile.sh

1-5) 결과를 확인합니다.

 

 

 


 

2. 명령어 처리 결과에 대해 반복 처리

#!/bin/bash

[다중결과값을 가지는 명령어] | while read [라인변수명]
# ls 명령어의 결과값을 while문에 전달
# file : 읽어올 라인에 대한 변수명 지정
do
	반복작업할 내용 작성
done

 

예시 2)

디렉토리 내용을 조회하는 ls 명령어의 결과를 출력하기

 

2-0) 대상 파일 목록(files 디렉토리)을 확인합니다.

ls명령어를 통해 files 디렉토리 내 파일 목록 확인

 

2-1) vi 명령어를 이용하여 readFromCmd.sh 이름으로 shell script를 작성합니다.

#!/bin/bash

ls files | while read file
# ls 명령어의 결과값을 while문에 전달
# file : 읽어올 라인에 대한 변수명 지정
do
	echo $file
    # 변수 file의 값을 불러와 출력
done

2-2) 실행권한을 부여한 후 실행합니다.

chmod +x readFromCmd.sh

 

./readFromCmd.sh

2-3) 결과를 확인합니다.

 

 


 

 

응용 예시 )

현재 폴더를 기준으로 txt 확장자를 가진 모든 파일을 찾아

그 중 'APPLE'이라는 단어를 포함하는 파일만 result.out 파일에 쓰기

#!/bin/bash

find ./ -name '*.txt' | while read result
do
	if cat $result | grep -qi 'APPLE'; then
	# -q 옵션 : --quiet. 출력없이
	# -i 옵션 : --ignore-case. 대소문자 구분없이
		echo $result
	fi
done > result.out
# echo 값을 result.out 파일에 씀

cat 명령어를 통해 결과 파일(result.out) 확인
결과파일에 담긴 파일들은 'APPLE'이라는 단어를 포함

 

 


 

 

참고사항

while과 do를 inline으로 작성하려면 세미콜론(;)이 필요하다.

라인 분리를 할 경우 세미콜론이 필요하지 않다.

 

다음 두 예문은 같은 내용이다.

while read line
do
	echo $line
done < file.txt
while read line; do
	echo $line
done < file.txt

 

 


 

 

본 글은 다음을 참고하여 작성되었습니다.

https://twpower.github.io/155-use-file-or-command-ouput-in-while-loop

 

[Shell Script] 파일이나 명령어 결과를 한줄씩 while문에서 처리하기

Practice makes perfect!

twpower.github.io

 

728x90
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
05-02 11:49