정규식을 사용하여 명령 출력에서 일부 텍스트 패턴을 캡처하고 배열을 만들려고 합니다 list_mqs
. 문제는 이전 명령이 중단되어 결코 종료되지 않는다는 것입니다. 따라서 a를 사용하면 다른 루틴이 완료되지 않기 때문에 pipeline | egrep
명령이 시작되지 않습니다 .egrep
제가 포착하려는 패턴은
MQ_1A
, MQ_F5
, 입니다 MQ_H7
.
[user@host] list_mqs=($(command_never_ends | egrep -io "MQ_*"))
이전 명령이 끝나지 않더라도(또는 종료에 도달하면 카운터를 설정하더라도) 이전 명령의 출력을 리디렉션하고 해당 내용을 루틴 분석을 위해 전달할 수 있는 방법이 있습니까 egrep
?
답변1
명령/응용 프로그램을 파이프했는데 명령/응용 프로그램이 출력을 표시하지 않는 경우 이는 buffer
.
파이프를 통해 출력을 얻는 두 가지 솔루션(더 많은 솔루션이 있다고 생각합니다)이 있습니다.
해결 방법 1:사용unbuffer
unbuffer command_never_ends | egrep -io "MQ_*"
#Or if the 'command_never_ends' does really finish:
list_mqs=("$(unbuffer command_never_ends | egrep -io "MQ_*")")
해결 방법 2:사용named pipes
#Create the named pipe
mkfifo pipe1
#Redirecting 'command_never_ends' output (stdout,stderr) to named pipe
command_never_ends &> pipe1
이것을 사용하면: command_never_ends &> pipe1
명명된 파이프가 나타날 때까지 프로그램이 시작되지 않습니다.파이프 1읽었다. 이제 다음과 같이 해야 합니다.
#Reading line per line the output of 'command_never_ends'
while read -r line; do
egrep -io "MQ_*" <<< "$line"
done < pipe0
너는 볼 수있어내 대답Java 애플리케이션을 사용하여 파이프에 데이터를 보내는 명명된 파이프에 대해 설명합니다.
노트
명령을 사용해 보았지만 stdbuf
작동하지 않는 것 같습니다. 나는 이것을 알고 stdbuf
있으며 unbuffer
다른 방식으로 일합니다. 이것을 달성하기 위해 그것을 사용하는 방법을 아는 사람이 있다면 stdbuf
나에게도 효과가 있을 것입니다.