Preciso pesquisar em nossos logs de email um endereço de email específico. Mantemos um arquivo atual chamado maillog , além de uma semana de arquivos .bz2 na mesma pasta. Atualmente, estou executando os seguintes comandos para procurar o arquivo:
grep person@domain.com maillog
bzgrep person@domain.com *.bz2
Existe uma maneira de combinar os comandos grep
e bzgrep
em uma única saída? Dessa forma, eu poderia canalizar os resultados combinados para um único email ou um único arquivo.
()
vez de{}
?()
mas não{}
, de qualquer maneira +1, pois é disso que eu precisava!O bzgrep assume automaticamente o grep normal se um arquivo não estiver compactado com bzip. Portanto, o seguinte deve ser suficiente:
Ah, claro, aqui está minha solução obrigatória GNU Parallel também:
o que pode ser muito mais rápido se você estiver verificando muitos arquivos.
fonte
Aqui está outra maneira de fazer isso (supondo que você esteja executando o bash, o que provavelmente é):
Aqui, o bash alimenta de maneira transparente a saída dos comandos bzgrep e grep no gato como se fossem arquivos (e meio que estão sob o capô, detalhes em url na parte inferior).
No seu caso particular, eu recomendaria a solução de Phil, mas o acima é um bom truque para manter em sua bolsa.
Se você estiver interessado, pode ler mais aqui: http://www.tldp.org/LDP/abs/html/process-sub.html
fonte
No momento em que escrevi isso, a sintaxe da resposta aceita estava errada para a maioria, senão todas, as conchas derivadas de Bourne, inclusive
bash
. Sugeri uma edição na parte superior e aceitei a resposta para corrigir isso, mas também estava inclinado a adicionar todas essas outras informações, e isso teria sido mais uma reescrita do que uma edição.Você pode usar comandos compostos:
..ou subcascas (observe os parênteses em vez de chaves):
..para agrupar os comandos. A maneira do subshell possui uma sintaxe melhor (mais tolerante à falta de espaço em branco e permite que você omita o último ponto e vírgula), mas cria um novo processo ou "finge" executando os comandos em um ambiente limpo. Ambos têm vantagens dependendo do que você deseja fazer, o que não importa aqui, mas vale a pena procurar se você quiser mais proficiência com o shell.
Nota: Você também pode usar o pipelining com esses truques, para fazer algo assim:
PS se você não se preocupam com a ordem das partidas em sua produção combinada, você pode usar um único
&
entre os dois comandos, assim:{ grep ... & bzgrep ...; }
. Em seguida, os dois comandos são executados simultaneamente: ogrep
é lançado e o shell o coloca em segundo plano; então, o shell executa obzgrep
. (Mas há uma pequena ressalva sobre isso, com a explicação que envolve o redirecionamento de arquivos e o buffer de fluxo de arquivos, potencialmente fazendo com que uma parte muito pequena das linhas no arquivo de saída seja dividida / mutilada: se você verá isso, isso dependerá de comogrep
,bzgrep
, e aslibc
stdio.h
funções são implementadas. Na maioria das implementações, acredito que canalizar o comando antes de redirecionar para um arquivo evitará o problema; portanto, você pode fazer isso{ foo & bar; } | cat - >file
como uma solução alternativa.)fonte
Você pode amarrar os comandos com &&, o que permitirá executar cada comando.
você também pode adicionar >> textfile.txt ao final de cada comando e fazer com que a saída atinja um arquivo e envie-o por correio.
fonte
grep ... && bzgrep ...
, se o grep não tivesse acertos, ele retornaria a falha e o comando pararia.>>
é uma boa idéia, porém, ao contrário>
, ele adiciona saída ao final de um arquivo existente.