![파일에서 검색할 검색어로 grep에 연속 스트림을 공급합니다.](https://linux55.com/image/100118/%ED%8C%8C%EC%9D%BC%EC%97%90%EC%84%9C%20%EA%B2%80%EC%83%89%ED%95%A0%20%EA%B2%80%EC%83%89%EC%96%B4%EB%A1%9C%20grep%EC%97%90%20%EC%97%B0%EC%86%8D%20%EC%8A%A4%ED%8A%B8%EB%A6%BC%EC%9D%84%20%EA%B3%B5%EA%B8%89%ED%95%A9%EB%8B%88%EB%8B%A4..png)
나는 임의의 숫자를 쓰는 명명된 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
포함하는 모든 줄과 일치합니다 . 파이프를 통해 연결된 숫자 중 하나로 시작하는 줄만 일치시키려면 다음과 같은 것을 사용하세요.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