我正在尝试使用正则表达式来捕获命令输出中的一些文本模式并创建一个数组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
.
您有两个解决方案(我想还有更多)可以通过管道并获得输出:
解决方案一:使用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
它对我也应该有用。