web-dev-qa-db-ja.com

grepコマンドの結果として受信した各行を処理する方法

grep コマンドを次のように実行した後、ファイルから多数の行を取得しています。

var=`grep xyz abc.txt`

結果としてxyzで構成される10行を得たとしましょう。

次に、grepコマンドの結果として取得した各行を処理する必要があります。これを進めるにはどうすればよいですか?

128
P_Jain

簡単な方法の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)
232
Mat

以下の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ハッカーのページ で説明されています:

プロセス置換は、プロセスの入力または出力(コマンドのシーケンス)が一時ファイルとして表示されるリダイレクトの形式です。

18
fedorqui

ここでは、grep +他の何かの代わりにawkを使用することをお勧めします。

awk '$0~/xyz/{ //your code goes here}' abc.txt

8
Julien Grenier

多くの場合、処理の順序は重要ではありません。 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
0
Ole Tange