如何将std-out多个命令传递给单个命令?类似的东西:
(cat my_program/logs/log.*;tail -0f my_program/logs/log.0) | grep "filtered lines"
我想使用管道在单个命令行上运行以下所有命令,而不是重定向到临时文件(如果可能)。有一个小的细微差别意味着我不能使用括号;我希望最后一个命令是一个尾部输入,所以我希望gred在std-in接收到每一行之后发生 - 而不是等待EOF信号。
答案 0 :(得分:8)
尝试使用当前shell而不是子shell:
{ cat file1; tail -f file2; } | grep something
需要在结束括号前的分号。
答案 1 :(得分:1)
如果命令不必并行执行,那么您可以使用cat将输出统一为单个连续流,如下所示:
tail -0f log.0 | cat - log.* | grep "filtered lines"
魔术位是cat的 - 参数;它告诉cat接受stdin并将其添加到要连接的输入列表(其他的,在本例中为logfiles)。
答案 2 :(得分:0)
好吧,我有一个凌乱的解决方案(这是一个脚本 - 遗憾的是,这对于命令行来说是不切实际的):
#!/bin/bash
ProcessFIFO(){
while [[ -p /tmp/logfifo ]]; do
grep "filtered lines" < /tmp/logfifo
done
}
OnExit(){
rm -f /tmp/logfifo
echo 'temp files deleted'
exit
}
# Create FIFO
mkfifo /tmp/logfifo
trap OnExit SIGINT SIGTERM
ProcessFIFO &
cat log.* > /tmp/logfifo
tail -0f log.0 > /tmp/logfifo
我已经习惯了@itsbruce建议的FIFO方法,我还必须使用while循环来阻止grep结束EOF信号:
while [[ -p /tmp/logfifo ]]
我还包括一个删除FIFO的陷阱:
trap OnExit SIGINT SIGTERM