From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16523 invoked by alias); 25 Oct 2013 01:16:42 -0000 Mailing-List: contact zsh-workers-help@zsh.org; run by ezmlm Precedence: bulk X-No-Archive: yes List-Id: Zsh Workers List List-Post: List-Help: X-Seq: 31893 Received: (qmail 21837 invoked from network); 25 Oct 2013 01:16:36 -0000 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on f.primenet.com.au X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 From: Bart Schaefer Message-id: <131024181627.ZM8127@torch.brasslantern.com> Date: Thu, 24 Oct 2013 18:16:27 -0700 In-reply-to: Comments: In reply to Cary Lewis "tee stdin and grep without creating a temp file" (Oct 23, 2:46pm) References: X-Mailer: OpenZMail Classic (0.9.2 24April2005) To: Cary Lewis , zsh-workers@zsh.org Subject: Re: tee stdin and grep without creating a temp file MIME-version: 1.0 Content-type: text/plain; charset=us-ascii [This is really a question of the zsh-users variety, but ...] On Oct 23, 2:46pm, Cary Lewis wrote: } } I have a situation where I need to grep an stdin input stream, and based on } whether I find a certain pattern, take appropriate action. The action } involves processing the stdin stream again. This is only going to work with a temp file, because your last step ("take appropriate action") depends on two inputs, the result of grep and the original input stream. That means the input stream has to be buffered somewhere until grep gets a hit, and the only way you can do an arbitrary amount of buffering is to use a temp file. However, you should be able to run the grep in parallel with creating the temp file, rather than capturing the entire output in the file before you begin to grep it. } I tried to create a fifo with mkfifo, and tee the stdin to the pipe } and then grep on the output of the tee. This approach doesn't work } correctly. For this to work, you'd have to have something reading from the fifo to keep the buffer from filling up. It ought to be possible to get this approach to work by replacing the fifo with an actual file, or to use a zsh "multio" instead of tee. setopt multios # Probably not needed, this is the default if print -l some simulated input > bufferfile | grep -q simulated then read -E appropriate_action < bufferfile fi Depending on how far back you need to look in the stream once the grep succeeds, you might consider using e.g. perl for the whole task. Buffer what you need inside the program that's doing the pattern match, then have that program branch to the appropriate action. This would be particularly effective if you don't need to "look behind" at all, that is, if it's only a matter of changing where the remainder of the output is going once the pattern matches. You could do that in zsh with a "while read ..." loop but that would be slower than grep or perl on a large input.