Bashの単一の操作でgrepの出力と戻り値を取得します。

Bashの単一の操作でgrepの出力と戻り値を取得します。

私はbashスクリプトを書いています。特定のコマンドとgrepを実行します。

pfiles $1 2> /dev/null | grep name # $1 Process Id

応答は次のようになります。

sockname: AF_INET6 ::ffff:10.10.50.28  port: 22
peername: AF_INET6 ::ffff:10.16.6.150  port: 12295

応答は行なし、1行、または2行です。
grepが行を返さない場合(grep戻りコード1)、スクリプトを中止します。行が1つある場合は、A()またはB()を呼び出します(行が1つ以上の場合)。出力が1〜2行の場合、grepの戻りコードは0です。

grepには戻り値(0または1)と出力があります。
どうすれば両方をキャッチできますか?私が次のことをするなら:

OUTPUT=$(pfiles $1 2> /dev/null | grep peername)

その後、OUTPUT変数は出力(文字列)を持ちます。また、grepを実行するためのブール値も必要です。

答え1

あなたはそれを使用することができます

output=$(grep -c 'name' inputfile)

変数にはoutput数値0または1が含まれます2。その後、ifステートメントを使用してさまざまな操作を実行できます。

答え2

これは非常に簡単です。

OUTPUT=$(pfiles "$1" 2> /dev/null | grep peername)
grep_return_code=$?

$(…)コマンド置換を変数に割り当てると、から$?コピーされます$(…)。もちろん、$?これを明示的に参照する必要はありません。

if OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名)
それから
    #残りのスクリプト
フィリピン諸島

または

もしOUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名)
それから
    出口
フィリピン諸島
#残りのスクリプト

このアプローチは、次のような状況で役立ちます。出力このコマンドとその戻りコード(終了状態ともいう)は関係ありません。しかし、その場合はgrep相関関係が高いです。つまり、出力が生成されると成功します。出力が生成されない場合は失敗します。それでは、単にテストしてみてはいかがでしょうか?出力 ?

OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名)
if["$output"]
それから
    #残りのスクリプト
フィリピン諸島

または

OUTPUT=$(pfiles "$1" 2> /dev/null | grep ピア名)
もし[-ジ「$出力」]
それから
    出口
フィリピン諸島
#残りのスクリプト

"$1"PS:妥当な理由がなく、自分が何をしているのかわからない限り、常にシェル変数参照(例:)を引用する必要があります。

答え3

必要な結果が必要な場合は、他の回答に記載されているフラグをgrep使用することはできません。-cしかし、できることは2回実行することです。一度は-cフラグを使用して一致の数を取得し、一度は-cフラグなしで一致を確認します。ただし、これは入力ファイルのサイズによって非常に非効率的になる可能性があります。

次のことができます。

コンテンツ入力する:

The first line is foo
I have a drink at the bar
The third line is foo again

コンテンツスクリプト:

#!/usr/bin/env bash

countMatches(){
    echo Searching for "${1}"
    result=$(grep "${1}" input)
    if [ "$?" -ne 0 ]; then
        echo No match found
        echo
        exit 1
    fi

    if [ $(echo "${result}" | wc -l) -eq 1 ]; then
        echo 1 match found:
        echo "${result}"
        echo
    else
        echo 2 matches found:
        echo "${result}"
        echo
    fi
}

countMatches foo
countMatches bar
countMatches baz

呼び出すときの出力です。スクリプト:

Searching for foo
2 matches found:
The first line is foo
The third line is foo again

Searching for bar
1 match found:
I have a drink at the bar

Searching for baz
No match found

答え4

その出力を表示し続けている間に、いくつかのパイプ出力のテストでgrepを使用する方法を理解しようとしている間、この問題に直面しました。ファイルをgrepingするのではなくstdinを使用していることに注意してください。

私の具体的な例は次のとおりです。

./manage.py --dry-run makemigrations | grep "No changes detected"

当時のリターンコードは0(成功)でしたNo changes detected。変更がある場合、戻りコードは1(失敗)です。ただし、grepが一致しないため、必要な変更は印刷されません。

私の解決策は次のとおりです

./manage.py --dry-run makemigrations | tee /dev/stderr | grep -q "No changes detected"

これは常に出力を印刷しますが、それでも正しいエラーコードが返されます。

関連情報