ファイルから検索するクエリでgrepに連続ストリームを提供します。

ファイルから検索するクエリでgrepに連続ストリームを提供します。

私はランダムな数字を書く名前付きfifoを持っています。 fifoに書き込むときに、numbers.txtファイルから作成されたテキストを見つけて、結果行を標準出力に書きたいと思います。

ファイルの内容は次のとおりnumbers.txtです。

1 one
2 two
3 three
... and so on

grepこのファイルにパイプされたテキストを検索したいです。たとえば、1名前付きパイプに書き込む場合、grepは1 one標準出力として印刷する必要があります。

最初の端末で次のコマンドを実行しています。

cat <> myfifo | grep -f - numbers.txt

次のように他の端末のfifoにデータを書き込みます。

echo 1 > myfifo

ただし、最初の端末ウィンドウのstdoutには出力は表示されません。

2番目のターミナルウィンドウで実行したときに2 two最初のターミナル出力を見たいです。echo 2 > myfifoこの目標を達成する方法は?

答え1

cat <> myfifo読み書きするために名前付きパイプを開きます。書き込み用にパイプが開いている限り、リーダーはファイルの終わりに達しません。したがって、cat入力の終わりに到達しないため、出力(つまりパイプ付きパイプ)を閉じないため、grepオプションgrepの入力の終わりに達しません-f

Grepは、検索するパターンがわかるまで検索を開始できません。だからそれは永遠にブロックされていても読み始めることもありませんnumbers.txt

パターンの発生を検索するには、myfifo次のようにします。

grep -f myfifo numbers.txt

書くこともできますが、cat <myfifo | grep -f - numbers.txt必ずしも複雑ではありません。

likeパターンはegを1含むすべての行と一致します。パイプを介して接続された数字の1つで始まる行のみを一致させるには、次のようなものを使用します。111 eleven

<myfifo sed 's/^0*/^0*/; s/$/ /' | grep -f - numbers.txt

答え2

あなたのコードがうまくいかない理由がわかりません。<>リダイレクトの受信に関連していて、catテキスト終了フラグに応答しないため、何も取得できないようですgrep推測する。もっと知識のある人がこれについて説明できるでしょう。

とにかく、次の操作が行われます。

端末に書き込む:

$ printf "%s\n" {1..7} > myfifo

または:

$ cat > myfifo
1
2
3
4

受信端末:

$ grep -f myfifo numbers.txt 
1 one
2 two
3 three
4 four
5 five
6 six
7 seven

またはこれ:

cat myfifo | grep -f - numbers.txt

関連情報