bashからgrepへのパイプgrep出力

bashからgrepへのパイプgrep出力

テキストファイルがあり、search_stringはありますがExcept_stringはない行を検索したいと思います。

端末では、以下は私が望む出力を提供します。

grep "search_string" | grep -v "\(exclude_string_A\|exclude_string_B\)"

テキストファイルで特定の問題(主にgrepとsedを使用)を検索するbashスクリプトがあります。最初のgrepコマンドの出力は、2番目のコマンドの入力として使用されていないようです。

たとえば、次を含むファイルの場合:

Gary: yes, that's what I said.  
Paul: well, I didn't hear you.  
Gary: okay, let's go.  

Bashスクリプトでは、関連する行は次のようになります。

grep "Gary:" | grep -v "\(said\|told\)" $1

ただし、出力ファイルには次の部分が含まれています。

Paul: well, I didn't hear you.  
Gary: okay, let's go.

ここに何か簡単な欠落があることを願っています!

答え1

あなたの考えは正確ですが、入力ファイル/文字列パラメータが間違った場所にあります。それは次のように書かなければなりません

grep "Gary:" "$1" | grep -v "\(said\|told\)"

これはgrep、最初に一致する式を適用することを意味します。みんなorという単語を含む行Garysaidorという単語を含む行をフィルタリングしますtold

パイプを使用して実行すると、両方のプロセスが開始されますが、パイプを介してgrepstdinから入力を取得し、表示される数行を印刷するのではなく、入力後の部分がファイルのように処理されます。|$1

grepただし、この時点では、最初の端末はまだ標準入力ストリームからの入力を待っていますが、入力が表示されないため、端末が停止していることがわかります。Ctrl-CSIGINT信号を送信するには押します。最後に、パイプラインは終了します。

関連情報