Fluxo contínuo de piping para grep como termo de pesquisa para pesquisa em um arquivo

0

Eu tenho um fifo chamado e estou escrevendo um número aleatório para este fifo. Quando eu escrevo para fifo eu quero encontrar texto escrito no arquivo numbers.txt e escrever a linha do resultado para stdout.

O conteúdo do arquivo numbers.txt é:

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

Eu quero pesquisar texto que canalizou para grep neste arquivo. Por exemplo, se eu escrever 1 para pipe nomeado, o grep deve imprimir 1 one para stdout.

Estou executando o comando mostrado abaixo no primeiro terminal:

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

E estou escrevendo para fifo em outro programa de terminal, conforme abaixo:

echo 1 > myfifo

Mas não consigo ver nenhuma saída no stdout na primeira janela do terminal.

Eu quero ver 2 two na primeira saída do terminal quando eu executar echo 2 > myfifo na segunda janela do terminal. Como conseguir isso?

    
por Mesut Tasci 03.12.2016 / 18:14

2 respostas

2

cat <> myfifo abre o pipe nomeado para leitura e gravação. Enquanto o pipe estiver aberto para gravação, o leitor não alcançará o final do arquivo. Portanto, cat nunca atinge o final de sua entrada, portanto, ela nunca fecha sua saída, que é o canal para grep , portanto, grep nunca atinge o final da entrada para a opção -f .

O grep não pode começar a pesquisar até saber qual padrão pesquisar. Então, ele permanece bloqueado para sempre, mesmo sem começar a ler numbers.txt .

Se você quiser pesquisar os padrões que chegam por myfifo , use

grep -f myfifo numbers.txt

Você também pode escrever cat <myfifo | grep -f - numbers.txt , mas isso é desnecessariamente complicado.

Observe que um padrão como 1 corresponde a qualquer linha contendo 1 , como 11 eleven . Se você quiser combinar apenas as linhas que começam com um dos números que passam pelo canal, use algo como

<myfifo sed 's/^0*/^0*/; s/$/ /' | grep -f - numbers.txt
    
por 04.12.2016 / 00:10
0

Eu não sei porque seu código não funciona, eu acho que tem a ver com o redirecionamento <> com o recebimento de cat e ele não está respondendo ao sinal Fim de Texto, então nada passar para grep . Mais uma vez, eu acho . Alguém mais experiente poderia explicar isso.

De qualquer forma, o seguinte fará.

Terminal de escrita:

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

Ou:

$ cat > myfifo
1
2
3
4

Terminal de recebimento:

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

Ou isto:

cat myfifo | grep -f - numbers.txt
    
por 03.12.2016 / 19:38