Al momento della mia stesura di questo, la sintassi della risposta accettata era errata per la maggior parte, se non per tutte, le shell derivate da Bourne, incluso bash. Ho suggerito una modifica all'inizio e ho accettato la risposta per risolverlo, ma ero anche incline ad aggiungere tutte queste altre informazioni, e questo sarebbe stato più una riscrittura che una modifica.
Puoi usare i comandi composti:
{ grep ...; bzgrep ...; } >file
..o subshells (notare le parentesi anziché le parentesi graffe):
(grep ...; bzgrep ...) >file
..per raggruppare i comandi. Il modo subshell ha una sintassi migliore (più tollerante della mancanza di spazi bianchi e consente di omettere l'ultimo punto e virgola), ma o forgia un nuovo processo, o "finge" di farlo eseguire i comandi in un ambiente pulito. Entrambi hanno vantaggi a seconda di ciò che si desidera fare, che non importa qui, ma vale la pena cercare se si desidera una maggiore competenza con la shell.
Nota: puoi usare il pipelining anche con questi trucchi, quindi potresti fare qualcosa del genere:
{ grep ...; bzgrep ...; } | less
PS se non si preoccupano l'ordinamento delle partite in vostro output combinato, è possibile utilizzare un unico &tra i due comandi, in questo modo: { grep ... & bzgrep ...; }. Quindi i due comandi vengono eseguiti contemporaneamente: grepviene avviato e la shell lo mette in background, quindi la shell eseguirà il bzgrep. (Ma c'è un piccolo avvertimento a riguardo, con la spiegazione che riguarda il reindirizzamento dei file e il buffering del flusso di file potenzialmente causando una porzione molto piccola delle righe nel file di output da dividere / alterare: se vedresti che ciò dipenderà da come grep, bzgrepe le libc stdio.hfunzioni sono implementate. Nella maggior parte delle implementazioni, credo che reindirizzare il comando prima di reindirizzare a un file eviterà il problema, quindi potresti fare { foo & bar; } | cat - >fileuna soluzione alternativa.)