私はランダムな数字を書く名前付き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つで始まる行のみを一致させるには、次のようなものを使用します。1
11 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