2016-11-17 6 views
1

私はbashを学んでいます。私は一度にgrepで戻り値とマッチした行を取得したいと思います。返り値を取得し、bashで一度にgrepで一致した行を得る方法はありますか?

if cat 'file' | grep 'match_word'; then 
    match_by_grep="$(cat 'file' | grep 'match_word')" 
    read a b <<< "${match_by_grep}" 
fi 

上記のコードでは、grepを2回使用しました。私は一度grepでそれをやる方法を考えることができません。 catはエラーメッセージを出力する可能性があるので、一致する単語がない場合でもmatch_by_grepは常に空です。

match_by_grep="$(cat 'file' | grep 'match_word')" 
if [[ -n ${match_by_grep} ]]; then 
    # match_by_grep may be an error message by cat. 
    # So following a and b may have wrong value. 
    read a b <<< "${match_by_grep}" 
fi 

教えてください。どうもありがとうございました。

+0

は、サンプル入力と期待出力 – Inian

+0

ショー入力、期待される出力を提供します。 – 123

+1

補足として、 'cat file | grep pattern file'ではなく 'grep pattern file'を使うのが望ましいです。 grep pattern' – Aaron

答えて

1

あなたは変数に検索出力を格納し、それが空でなければ見ることによってgrepの二重の使用を避けることができます。

スクリプトのバージョンがダブルでない場合grep

#!/bin/bash 

grepOutput="$(grep 'match_word' file)" 

if [ ! -z "$grepOutput" ]; then 
    read a b <<< "${grepOutput}" 
fi 

上記のスクリプト(あなたも一時変数を削除することができます)

#!/bin/bash 

grepOutput="$(grep 'match_word' file)" 

[[ ! -z "$grepOutput" ]] && (read a b <<< "${grepOutput}") 

以上の最適化、検索結果を解析する条件ならば、一度チェックするために一度、二重のgrepを使用するようなものになるだろう - コマンド拡張を含む文字列の変数を割り当てる場合

#!/bin/bash 

if grep -q 'match_word' file; then 
    grepOutput="$(grep 'match_word' file)" 
    read a b <<< "${grepOutput}" 
fi 
0

達成したいのですか?

grep 'match_word' file ; echo $? 

$?には直前に実行されたコマンドの戻り値があります。
戻り値を把握したい場合は、PS1を$?に設定すると便利です。

参考:Bash Prompt with Last Exit Code

+0

お返事ありがとうございます。ファイルに一致する単語を含む行がある場合にのみ、一致する行を読み込み(または解析したい)したいと思います。これを行うために、grepを2回使用しましたが、効率的ではないと感じています。可能であれば、私は1つのgrepだけでやりたいと思います。 – mora

+0

@moraあなたの意図を誤解しています - 一致する単語が見つかった場合にのみgrep出力をさらに分析したい場合は、$? grepの直後: – Ryota

+0

@Ryota:あいまいな質問にお答えいただき、ありがとうございます。 – mora

1

、リターンコードが展開されている(右端)コマンドのものです。

は、言い換えれば、あなただけの条件として割り当てを使用することができます。

if grepOutput="$(cat 'file' | grep 'match_word')" 
then 
    echo "There was a match" 
    read -r a b <<< "${grepOutput}" 
    (etc) 
else 
    echo "No match" 
fi 
関連する問題