web-dev-qa-db-ja.com

コマンド出力から正確なWordを印刷したい

telnet test | grep -o Unable
telnet: Unable to connect to remote Host: Connection refused

結果は「Unable」のみです。

3
user410194

接続できない場合にtelnetが出力するエラーメッセージは、標準のerrorストリームに出力されます。標準エラーストリームは、デフォルトでは直接端末に送信されます。パイプを使用できるのは、標準のoutputストリームを他のコマンド(この場合はgrep)に渡すことだけです。

リダイレクトによって、エラーストリームを標準出力ストリームに送信できます。

telnet test 2>&1 | grep -o Unable

これは2つのストリームをマージし、grepはマージされたデータストリームとして機能します。

telnetでエラー状態をキャッチする場合は、ユーティリティの終了ステータスを使用することもできます。

if ! telnet test 2>/dev/null; then
    echo 'something went wrong with telnet'
    exit 1
fi

echo 'telnet ran successfully'

telnetがゼロ以外の終了ステータスを返した場合(なんらかの失敗を通知)、これはスクリプトを終了します。さらに、エラーストリームを/dev/nullにリダイレクトして完全に破棄しました。

5
Kusalananda

メッセージがstderrに出力されているようですので、次のようにしてください。

telnet test 2>&1 | grep -o Unable

BashとZSHでは、|&も使用できます。

telnet test |& grep -o Unable
4