Конвейерная передача непрерывного потока в grep в качестве поискового запроса для поиска в файле

У меня есть имя fifo, и я записываю в него случайное число. Когда я пишу в fifo, я хочу найти записанный текст в файле numbers.txt и записать строку результатов в stdout.

Содержимое файла numbers.txt :

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

Я хочу найти в этом файле текст, который передан на grep .Например, если я напишу 1 в именованный канал, grep должен вывести 1 в стандартный вывод.

Я запускаю в первом терминале команду, показанную ниже:

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

И я пишу в fifo в другом показе терминала, как показано ниже:

echo 1> myfifo

Но я не вижу вывода в stdout в первом окне терминала.

Я хочу видеть 2 two в первом выводе терминала, когда я выполняю echo 2> myfifo во втором окне терминала. Как этого добиться?

0
03.12.2016, 21:31
2 ответа

cat <> myfifo открывает именованный канал для чтения и записи. Пока канал открыт для записи, читатель не доходит до конца файла. Таким образом, cat никогда не достигает конца своего ввода, поэтому он никогда не закрывает свой вывод, который является конвейером для grep , поэтому grep никогда не достигает конца ввода. для параметра -f .

Grep не может начать поиск, пока не знает, по какому шаблону искать. Таким образом, он остается заблокированным навсегда, даже не начиная читать из numbers.txt .

Если вы хотите найти шаблоны, проходящие через myfifo , просто используйте

grep -f myfifo numbers.txt

Вы также можете написать это cat , но это излишне сложно.

Обратите внимание, что шаблон вроде 1 соответствует любой строке, содержащей 1 , например 11 eleven . Если вы хотите сопоставить только строки, которые начинаются с одного из чисел, проходящих через конвейер, используйте что-то вроде

<myfifo sed 's/^0*/^0*/; s/$/ /' | grep -f - numbers.txt
2
28.01.2020, 02:34

Я не знаю, почему ваш код не работает, я предполагаю, что это связано с <> перенаправлением с принимающим cat и он не реагирует на знак End-Of-Text, так что ничего не проникает в 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
0
28.01.2020, 02:34

Теги

Похожие вопросы