変数から行を読み取る方法

変数から行を読み取る方法

次のようにテキストファイルから行を読み取る単純な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)

(2<文字に注意してください)これは、grep変数に保存するために出力全体をメモリに一度にロードするのを防ぎます。このプロセスはループと並列に実行され、ループは各行がgrep印刷されるとgrep出力をread入力(バッファリングされるまで)として処理します。

$(...)これは、コマンド置換を使用し、全体の出力を維持するよりも高速で、メモリを使用しにくい傾向があります。また、Bash固有のスクリプトを書く場合、通常はコマンドを使用する目的が明確になるので、より良いスタイルです。


確かにこれは少し半パターンです。必要な処理のためにwhile read ...Bashで処理するよりも通常のパイプを使用する方が良いかもしれませんが、2つのアプローチのうちの1つを使用する場合は有効です。

答え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

関連情報