파일에서 검색할 검색어로 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 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포함하는 모든 줄과 일치합니다 . 파이프를 통해 연결된 숫자 중 하나로 시작하는 줄만 일치시키려면 다음과 같은 것을 사용하세요.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

관련 정보