변수에서 행을 읽는 방법 |

변수에서 행을 읽는 방법 |

다음과 같이 텍스트 파일에서 줄을 읽는 간단한 bash 스크립트가 있습니다.

#!/bin/bash
FILE=$1
while read line; do
...
done < $FILE

이것은 훌륭하게 작동하지만 이제 다음과 같이 grep을 사용하여 먼저 파일을 구문 분석하고 싶습니다.

INPUT_file=$(grep -E 'INPUT.*ACCEPT' $FILE)

이 결과는 INPUT_file 변수에 할당됩니다.

이제 변수 "INPUT_file"에서 줄을 읽고 싶지만 while 루프에 포함하려고 하면 다음과 같습니다.

while read line; do
....
done < $INPUT_file

다음 오류가 발생합니다.

$INPUT_file: ambiguous redirect

답변1

사용하시면 좋을 것 같아요프로세스 교체변수 대신:

while read line; do
....
done < <(grep -E 'INPUT.*ACCEPT' $FILE)

(두 <문자에 주목하세요) 이렇게 하면 grep변수에 저장하기 위해 전체 출력을 메모리에 한 번에 로드하는 것을 방지할 수 있습니다. 이 프로세스는 루프와 병렬로 실행되며 루프는 grep각 줄이 인쇄될 때 grep출력을 read입력(버퍼링될 때까지) 으로 처리합니다.

$(...)이는 명령 대체를 사용하고 전체 출력을 유지하는 것보다 더 빠르고 메모리를 덜 사용하는 경향이 있습니다. 또한 Bash 관련 스크립트를 작성하는 경우 일반적으로 명령을 사용하는 목적이 명확해지기 때문에 더 나은 스타일입니다.


틀림없이 이것은 약간의 반패턴입니다. 필요한 처리에 대해 while read ...Bash에서 처리하는 것보다 일반 파이프를 사용하는 것이 더 나을 수도 있지만 두 접근 방식 중 하나를 사용하는 유효한 경우가 있습니다.

답변2

그 때의여기에 있는 문자열역할을하다:

while read line; do
...
done<<<$INPUT_file 

답변3

grep이 경우에는 전화를 하시면 안됩니다. 이 모든 작업은 쉘을 사용하여 수행할 수 있습니다. 예를 들어

while read -r line; do [[ $line =~ INPUT.*ACCEPT ]] && printf '%s\n' "$line"; done < your_iptables_file

관련 정보