다음과 같이 텍스트 파일에서 줄을 읽는 간단한 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