web-dev-qa-db-ja.com

単一行のGrep

パターンを1行で改行するスクリプト(改行なし)があります。 grepstock_tickerをその行に入れて、見つけたらすぐに出力したいと思います。これで、スクリプトは終了せず、本質的に無限にループします。

これに取り組む方法の1つは、おそらく入力ストリームをラインに分割してそれをgrepにパイプすることだと考えました。出力をgrepできることを理解しています。ただし、私の理解によれば、grepsedawkからすべてを1行ずつ読み取ります。

とにかく、この動作を変更してこれに取り組むことができますか?

./a.out | grep 'stock_ticker'

現在Memory exhaustedを出力します。これは、grepが出力を出力する前に1行ずつ読み取るためです。その行動を変えたいと思います。どのようなアイデアですか?

12
Phani

改行がない場合、grepはすべての入力をバッファリングするため、文字列が表示される「行」を表示できます。

2つの質問:

  • 隣接するコンテンツが必要ですか?
  • トークンを区切るスペースまたはその他の文字はありますか?

隣接するコンテンツのコンテキストが不要で、トークンを区切るスペースがある場合は、trを使用してスペースを改行に変換します。

./a.out | tr ' ' '\n' | grep 'stock_ticker'

隣接するコンテンツが必要な場合は、オプションの1つを追加するだけです-C-Aまたは-Bをgrepコマンドに追加します。これにより、grepで検索パターンのティッカーの前後に「行」を表示できます。

13
Tim B