중단된 명령의 출력 캡처

중단된 명령의 출력 캡처

정규식을 사용하여 명령 출력에서 ​​일부 텍스트 패턴을 캡처하고 배열을 만들려고 합니다 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나에게도 효과가 있을 것입니다.

관련 정보