grep コマンドを次のように実行した後、ファイルから多数の行を取得しています。
var=`grep xyz abc.txt`
結果としてxyzで構成される10行を得たとしましょう。
次に、grepコマンドの結果として取得した各行を処理する必要があります。これを進めるにはどうすればよいですか?
簡単な方法の1つは、出力を変数に格納するのではなく、while/readループを使用して出力を直接反復することです。
何かのようなもの:
grep xyz abc.txt | while read -r line ; do
echo "Processing $line"
# your code goes here
done
このスキームには、目的に応じてさまざまなバリエーションがあります。
ループ内で変数を変更する必要がある場合(およびその変更をループの外部で表示できるようにする場合)、 fedorquiの答え に記載されているプロセス置換を使用できます。
while read -r line ; do
echo "Processing $line"
# your code goes here
done < <(grep xyz abc.txt)
以下のwhile read
ループを実行できます。これは、いわゆるプロセス置換を使用したgrep
コマンドの結果によって供給されます。
while IFS= read -r result
do
#whatever with value $result
done < <(grep "xyz" abc.txt)
この方法では、結果を変数に保存する必要はありませんが、その出力を直接ループに「注入」します。
BashFAQ/001の推奨事項に従ってIFS=
とread -r
の使用に注意してください: ファイル(データストリーム、変数)を行ごと(および/またはフィールドごとに)フィールド)? :
Readの-rオプションは、バックスラッシュの解釈を防ぎます(通常、バックスラッシュの改行ペアとして使用され、複数の行にまたがったり、区切り文字をエスケープしたりします)。このオプションを使用しない場合、入力内のエスケープされていないバックスラッシュは破棄されます。ほとんどの場合、-rオプションをreadとともに使用する必要があります。
上記のシナリオでは、IFS =は先頭および末尾の空白のトリミングを防ぎます。この効果が必要な場合は削除してください。
プロセスの置換については、 bashハッカーのページ で説明されています:
プロセス置換は、プロセスの入力または出力(コマンドのシーケンス)が一時ファイルとして表示されるリダイレクトの形式です。
ここでは、grep +他の何かの代わりにawkを使用することをお勧めします。
awk '$0~/xyz/{ //your code goes here}' abc.txt
多くの場合、処理の順序は重要ではありません。 GNUこの状況のために並列が作成されます。
grep xyz abc.txt | parallel echo do stuff to {}
処理がより似ている場合:
grep xyz abc.txt | myprogram_reading_from_stdin
myprogram
が遅い場合は、次を実行できます。
grep xyz abc.txt | parallel --pipe myprogram_reading_from_stdin